heavy(?) 한 작업 시 메시지 처리하기
Study/MFC 2005. 4. 6. 14:01 |예를 들어, 다이얼로그 박스가 떠있고, 내부적으로 연산량이 많은 작업을 하고 있다고 치자.
다이얼로그에서 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 를 쓰는 경우보다는 약간 어색할 수 있지만, 그래도 윈도우 메시지를 처리할 수 있다.
다이얼로그에서 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 를 쓰는 경우보다는 약간 어색할 수 있지만, 그래도 윈도우 메시지를 처리할 수 있다.
'Study > MFC' 카테고리의 다른 글
Windowx XP의 visual style 을 적용해보자 (0) | 2005.06.05 |
---|---|
동적 할당으로 2차원 배열을 생성하는 새로운 방법 (0) | 2005.04.21 |
view에 이미지 출력시 바탕에 사선 넣기 (0) | 2005.04.06 |
MDI 프로그램에서 처음에 새창 띄우지 않기 (0) | 2005.04.06 |
Visual C++ 6.0의 Profile 기능을 이용한 연산 시간 측정 (1) | 2005.04.06 |