'CWinThread'에 해당되는 글 1건

320x100

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

반응형

About

by 쑤기c

반응형