스레드에서 메시지 처리를 하는 경우 스레드에서 특별히 윈도우를 만들지 않는 이상 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 로 대기하게 되는 경우 데드락이 발생할 수 있으니 메지시를 받는 부분에서 이벤트 처리를 확실하게 해야 한다.
프로그래밍