OFFICE/프로그램

MFC스레드 - 작업자 스레드

gandus 2011. 7. 27. 16:31
MFC가 제공하는 스레드는 특성에 따라 두 종류로 나뉜다.

 1 작업자 스레드 :    - 메시지 루프가 없다. 
                             - 메시지 루프가 없어, 화면에 보이지 않는 백그라운드 작업을 수행할 때 적합하다.

 2. 사용자 인터페이스 스레드( UI스레드 ): - 메시지 루프가 존재한다.
                                                          - 메시지 루프가 존재해서, 윈도우를 만들고 출력하거나 사용자 입력 받는등 처리에...




1. 작업자 스레드

 - 작업자 스레드를 생성하는 핵심 함수는 AfxBeginThread() 이다. 


CWinThread* AfxBeginThread(
   AFX_THREADPROC pfnThreadProc,
   LPVOID pParam,
   int nPriority = THREAD_PRIORITY_NORMAL,
   UINT nStackSize = 0,
   DWORD dwCreateFlags = 0,
   LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL 
);


1-1 pfnThreadProc :

- 스레드 실행 시작점이 되는 함수를 가리키는 포인터이다. 제어 함수라고 부른다.
다음과 같은 형태를 지녀야 한다.

UINT 함수명(LPVOID pParam) 

제어함수는 작업자 스레드를 실행하면, 시작되고 종료하면 종료된다.
주의할 점은 반드시 전역함수나, 클래스 멤버함수면 정적함수로 만들어야 한다. 
 

1-2 pParam
- 제어 함수 실행 시 전달할 32비트 값이다. 구조체나 배열 혹은 동적으로 할당한 메모리를
전달하면, 크기와 상관없이 데이터를 저장할 수 있다.

1-3 THREAD_PRIORITY_NOMAL
-  스레드 우선순위 레벨 값이다.

1-4 nStackSize
- 스레드의 스택 크기를 바이트 단위로 지정한다. '0' 으로 하면, 부모 스레드 크기와 동일하게 설정한다.

1-5 dwCreateFlags
- 스레드 생성을 제어하는 옵션, 기본값인 0을 사용하면 스레드 생성되고 곧바로 실행.

1-6 lpSecurityAttrs
- 보안 설명자와 핸들상속정보를 전달한다, 대부분 기본으로 NULL능 사용한다. 



AfxBeginThread() 함수는 CwndThread 타입의 스레드 객체를 동적으로 생성하고 내부적으로 스레드를 만든 후
스레드 객체의 주소값을 리턴한다. 주소값으로 CWinThread 클래스의 멤버 함수를 호출하면,
스레드를 제어할 수 있다. 그중 유용한 함수는 다음과 같다.

- int CWinThread::GetThreadPriority() : 스레드의 우선순위 레벨값을 얻는다.
- Bool CWinThread::SetThreadPriority() : 스레드의 레벨값을 설정한다.
- DWORK CWindThread::SuspendThread() : 스레드의 실행을 일시중지한다. 
- DWORK CWindThread::ResumeThread() : 일시중지된 스레드를 재 실행한다.



작업자 스레드의 종료는 2가지 방법으로 종료될 수 있다.
방법1을 사용하면, 스레드 제어함수 리턴과 더불어 스택이 파괴되며 스레드 객체도 메모리에서 제거
방법2를 사용하면, AfxEndThread() 함수를 호출, 인자의 의미는 다음과 같다.

Void AFXAPI AfxEndThread( UINT nExitCode, Bool bDelete = TRUE );

1. nExitCode : 스레드 종료코드
2. bDelete : 스레드 객체를 메모리에서 제거할 것인지 나타낸다. 기본값인 True를 사용하면 방법 1과 동일
False를 하면, 스레드는 종료되지만, 스레드 객체는 메모리에 남아서, 나중에 재 사용이 가능하다.