'CWinThread'에 해당되는 글 1건
- 2009.12.15 CWinThread 내에서 생성한 CWnd 자동으로 삭제되버리는 문제
CWinThread 내에서 생성한 CWnd 자동으로 삭제되버리는 문제
Posted on 2009. 12. 15. 20:51
Filed Under Visual C++
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;
4.참고
MSDN - CWinThread overview
출처: http://blog.naver.com/kelly85/110014329730