예를 들어, 다이얼로그 박스가 떠있고, 내부적으로 연산량이 많은 작업을 하고 있다고 치자.
다이얼로그에서 cancle 버튼을 클릭하면 내부적인 연산을 취소하고 싶다.
그러나, 일반적으로 이 경우, 윈도우즈는 버튼이 클릭되었다는 메시지 처리를 바로 수행하지
못하고, 단지 메시지 큐에만 넣게된다. 바로 single-thread를 사용하기 때문이다.

이러한 문제를 해결하기 위해서는 multi-thread 를 사용하는 것이 가장 적절한 해법이겠으나,
다소 복잡할 수 있다.

여기서는 single thread를 사용하면서, 주기적으로 메시지 큐를 검사하는 방법을 설명한다.

다음 함수를 보자.

void ProcessMessages()
{
CWinApp* pApp = AfxGetApp();
MSG msg;

while( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) )
pApp->PumpMessage();
}

만약 프로그램 내부에서 복잡한 연산을 수행하는 루틴에 위의 함수를 주기적으로 호출한다면,
multi-thread 를 쓰는 경우보다는 약간 어색할 수 있지만, 그래도 윈도우 메시지를 처리할 수 있다.

Posted by kkokkal
: