본문 바로가기

Programming/MFC

CWinThread로 UI Thread 만들기

 


1.요약

CWinThread로 UI Thread를 만드는 방법과 주의해야 할 점 수록!!


2.본문

CWinThread를 사용해서 스레드를 만드는 방법은 2가지가 있습니다.

(1) AfxBeginThread() - Worker Thread

(2) CWinThread::CreateThread() - UI Thread

우리가 취해야 할 방법은 2번입니다.

AfxBeginThread()를 사용하는 경우에는 API인 CreateThread나 CRT인 _beginthread()처럼 스레드 입구 함수( entry-point)를 지정할 수 있습니다. 그러면 새 스레드는 그 함수를 실행하면서 시작된다고 볼 수 있습니다.

2번 방법인 CWinThread::CreateThread() 를 사용하는 경우에는 스레드 입구 함수를 넘겨줄 수 있는 인자는 없습니다. 다음과 같은 방법으로 해야되겠죠.

(1) CWinThread를 상속받는 클래스를 만든다.
==> 예를 들어서 CUIThread 라고 합시다.

(2) CUIThread::InitInstance()를 스레드 입구 함수로 보고 그곳에 필요한 코드를 넣습니다. 아마도 메인 윈도우를 만들어서 저장시키는 등의.. ( 여러분이 줄곧 CWinApp-based 클래스의 InitInstance() 에서 했던 일들이겠죠)

끝입니다. UI Thread이기 때문에 메인 윈도우가 죽으면서 PostQuitMessage() 를 해주면 스레드가 종료하겠죠.

스레드 종료시 CWinThread 객체는 디폴트로 자기자신의 메모리를 해제하도록 되어있습니다. 그러니까 만약에 CWinThread-based 클래스의 객체를 Heap( new나 malloc()으로 할당한경우)이 아닌 곳에 생성했다면 문제가 발생하겠죠.

이는 다음과 같은 간단한 조치로 막을 수 있습니다. CWinThread-based 클래스의 생성자에서 가볍게 다음과 같이 해주면 됩니다.

m_bAutoDelete = FALSE;
3.예제



4.참고

MSDN - CWinThread overview