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

프로그래밍/c++ 2013.02.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 다크 프로그래머

저작자 표시 비영리 변경 금지
신고
  • premo 2013.09.06 15:03 신고 ADDR 수정/삭제 답글

    구체적인 샘플 코드로 예를 들어 주시면 안될까요?

    • BlogIcon 다크pgmr 2013.09.06 15:15 신고 수정/삭제

      그냥 for 나 while 문 내부에 위 코드만 넣어주면 됩니다.
      for( ; ; ){
      ... // 원래 수행할 일
      ProcessWindowMessage();
      }
      그러면 for문을 다 돌고나서 윈도우(사용자) 메시지를 처리하는 것이 아니라, for문 돌면서 중간 중간에 메시지를 처리하게 됩니다.

  • nocool 2015.07.01 19:57 신고 ADDR 수정/삭제 답글

    감사합니다~!!! 삽질하다가 찾았는데 바로 해결했어요!!!

  • 김규형 2016.04.06 08:13 신고 ADDR 수정/삭제 답글

    문제를 딱 해결했네요. 감사합니다.