다이얼로그(dialog) UI 블로킹(응답없음) 현상 해결법 - C++ MFC

프로그래밍/c++ 2013. 2. 22. 12:14

MFC C++ 다이얼로그(dialog) 기반 프로그램에서 시간이 오래 걸리는 작업을 수행하다 보면 수행 동안에는 사용자 입력(키보드, 마우스)이 먹히지 않고 다이얼로그가 먹통이 되는 UI 블로킹(응답없음,멈춤,정지,다운 등) 현상이 발생한다.




원인은 다이얼로그 사용자 이벤트 메시지 처리하는 부분과 함수 실행 부분이 단일 쓰레드로 실행되어 메시지 파이프라인을 공유하기 때문에 함수처리가 끝나기 전까지는 메시지 처리가 안되기 때문인데, 가장 좋은 해결책은 시간이 오래 걸리는 해당 함수처리 부분을 별도 쓰레드로 분리하여 실행시키는 것이다.


하지만, 다른 한 방법은 메시지 큐에 있는 메시지들을 다음과 같이 직접 처리해 주는 방법도 있다.


void ProcessWindowMessage()

{

   MSG msg;

   while(::PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))

   {

      ::SendMessage(msg.hwnd, msg.message, msg.wParam, msg.lParam);

   }

}


이렇게 메시지처리 함수를 하나 만들어 놓고, 시간이 걸리는 함수 중간 중간에 위 함수를 호출해 주면 함수 실행 도중이더라도 사용자가 누른 버튼이나 키보드 메시지가 정상적으로 처리된다.


물론 가장 좋은 방법은 별도 쓰레드로 분리시키는 것이겠지만, while이나 for문 돌리는 반복형태의 프로그램에서는 그냥 간단하게 위 코드를 삽입해서 처리하는 것도 좋은 방법이다.

by 다크 프로그래머