스레드에서 메시지 처리를 하는 경우 스레드에서 특별히 윈도우를 만들지 않는 이상 PostThreadMessage 밖에 메시지를 보낼 수 있는 방법이 없다.
특별한 경우 SendThreadMessage 같은 걸 사용하고 싶은 경우 Event 객체를 써서 비슷하게 구현할 수 있다.
메시지 전송 부분
enum ThreadMessageFlag { TMF_ASYNC=0, TMF_SYNC };
HANDLE waitMsg = CreateEvent(NULL, TRUE, FALSE, NULL);
if(PostThreadMessage(threadId_, WM_THREAD_INITIALIZE, reinterpret_cast<WPARAM>(waitMsg), TMF_SYNC)) {
if(WaitForSingleObject(waitMsg, MSG_TIMEOUT) != WAIT_OBJECT_0) {
CloseHandle(waitMsg);
return false;
}
}
CloseHandle(waitMsg);
return true;
=========================================================
메시지 받는 부분
// 메시지 처리
...
// 메시지 동기화
if(lParam == TMF_SYNC) {
HANDLE waitMsg = reinterpret_cast<HANDLE>(wParam);
SetEvent(waitMsg);
}
return;
메시지 전송 부분에서 MSG_TIMEOUT 을 INFINITE로 하면 SendMessage와 비슷하게 되고 시간을 설정하게 되면 SendMessageTimeOut 형태로 구현할 수 있게 된다.
INFINITE 로 대기하게 되는 경우 데드락이 발생할 수 있으니 메시지를 받는 부분에서 이벤트 처리를 확실하게 해야 한다.
'윈도우 > 스터디' 카테고리의 다른 글
DLL (Dynamic Link Library) 정리 (0) | 2012.01.16 |
---|---|
Media Transfer Protocol (MTP) (0) | 2011.12.15 |
_stprintf_s (0) | 2011.11.28 |
Visual Studio C++ 메모리 릭 (2) | 2011.11.24 |