본문 바로가기

Programming/MFC

MFC CWinThread를 이용할때 주의할 사항

출처 피아니스트가 되고싶은 프로그래머 | gazette2
원문 http://blog.naver.com/gazette2/100008771257



다음은, CWinThread를 override해서 UI스레드를 만들때의 주의사항이다.


1. CWinThread::InitInstance를 반드시 오버라이드 해야하고, 이 메소드에서 TRUE를 반환해야 한다. TRUE를 반환하지 않은 경우, Thread가 생성되자 마자 곧 파괴되어 버린다. (AfxThreadEntry 함수 참조)


2. m_bAutoDelete 멤버를 주의해서 사용해야 한다. 보통 이 멤버를 FALSE로 놓고 쓰는 경우를 많이 보아 왔는데, 자칫하면 메모리가 샐수 있다. 이것은 Worker스레드에도 해당되는 내용이다.


3. 스레드를 무조건 종료시키지 말고, 스레드 내부에 처리해야 할 메시지가 아직도 남아 있는지 확인한 다음 종료시키도록 한다. 특히 하드웨어 디바이스와 관련 있는 스레드들은 관련된 메시지를 완전히 처리하지 않은 채로 스레드를 강제 종료 시키려 하는 경우, 프로세스 자체가 죽어버린다든지 하는 경우를 보았다.


4. CWinThread 하위 클래스에서 MFC를 사용하는 것은 안전하지만, 일반 스레드(CreateThread API를 사용하거나, _beginthreadex를 사용하거나 해서 만든 스레드들)에서 MFC를 사용하는 것은 안전하지 않기 때문에 주의해야 한다. 이것은 Worker스레드에도 해당되는 내용이다.


5. 서로 다른 스레드에서 소유하고 있는 CWnd 객체를 넘겨주지 않도록 한다. MFC는 TLS(Thread Local Storage)를 이용해 핸들 맵을 구현하였으므로, 서로다른 스레드간에는 핸들 맵이 틀리다. 직접 CWnd 개체를 다른 스레드에 넘겨주게 되면, 그 스레드에는 존재하지 않는 윈도우 핸들일 수 있으므로 오작동하게 된다. 이것은 Worker스레드에도 해당되는 내용이다.


6. 서로 다른 스레드에 윈도우를 전달해야 할 때는 핸들을 이용하도록 한다. CWnd::GetSafeHwnd() 멤버를 이용해 다른 스레드로 윈도우 핸들을 전달하고, 전달 받은 스레드에서 CWnd 멤버에 접근해야 할 필요가 있을경우, CWnd::FromHandle 등의 static 함수를 이용해 임시 CWnd 개체를 만든다음 접근한다.


7. 4, 5의 이유때문에 다른 스레드에 존재하는 메인 윈도우를 얻기 위해 AfxGetMainWnd()를 호출하는 것은 안전하지 않다. MFC 7.1에서는 메인 스레드가 아닌 다른 스레드에서 아예 접근 못하게 막아 버렸다. 이것은 Worker스레드에도 해당되는 내용이다.

'Programming > MFC' 카테고리의 다른 글

UpdateData ( FALSE )  (0) 2006.02.06
레지스트리에 등록하고 편리하게 사용  (0) 2006.01.12
CWinThread로 UI Thread 만들기  (0) 2006.01.06
DDX  (0) 2006.01.03
글꼴 만들기 (CreateFont함수 인자 설명)  (0) 2006.01.03