본문 바로가기

프로그래밍

PostThreadMessage로 SendThreadMessage 구현하기

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