2011. 11. 28. 18:43 윈도우/스터디

스레드에서 메시지 처리를 하는 경우 스레드에서 특별히 윈도우를 만들지 않는 이상 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
posted by townone