티스토리 뷰
1.요약
GetMessage()와 PeekMessage()의 차이점
(이하 GM과 PM으로 표기)
2.본문
GM과 PM은 모두 메시지 루프에서 쓰이는 API 입니다.
메시지 큐에서 메시지를 가져오는 역할을 하는데, 두 개의 차이점은 Win32 환경(선점형 멀티태스킹)에서도 중요합니다.
GM -> 새 메시지가 올 때까지 제어가 필요없음(양보)
PM -> 메시지를 얻어오고, 계속 제어를 원한다는 의미
GM 은 새 메시지가 올 때까지 블록되므로 CPU를 사용하지 않습니다.
Win16 환경에서는 스스로 다른 프로세스에게 CPU를 양보해야 했으므로 아주 중요한 일이었겠습니다.
하지만 Win32 환경에서도 GM을 사용해서 CPU 사용량을 줄이는 일은 매우 가치가 있습니다.
PM 은 CPU 시간을 낭비할 뿐 아니라, 운영체제가 idle time 에 할 일도 막아버리므로 범용 메시지 루프에서는 사용되어서는 안됩니다.
하지만 PM 은 작업 스레드를 사용하지 않고 배경 작업을 하고자 할 때 유용합니다.
(MFC의 OnIdle() 이 바로 PM을 사용해서 구현되었습니다)
왜냐면 PM 을 사용해서 메시지 큐에서 메시지를 꺼내오지 않고 메시지가 있는지 없는지 확인하는 것도 가능하기 때문입니다.
메시지가 없다면 필요한 배경 작업을 하면 되겠죠..
일반적인 패턴은 다음과 같습니다.
= 1 번 =
= 2번 =
GetMessage()와 PeekMessage()의 차이점
(이하 GM과 PM으로 표기)
2.본문
GM과 PM은 모두 메시지 루프에서 쓰이는 API 입니다.
메시지 큐에서 메시지를 가져오는 역할을 하는데, 두 개의 차이점은 Win32 환경(선점형 멀티태스킹)에서도 중요합니다.
GM -> 새 메시지가 올 때까지 제어가 필요없음(양보)
PM -> 메시지를 얻어오고, 계속 제어를 원한다는 의미
GM 은 새 메시지가 올 때까지 블록되므로 CPU를 사용하지 않습니다.
Win16 환경에서는 스스로 다른 프로세스에게 CPU를 양보해야 했으므로 아주 중요한 일이었겠습니다.
하지만 Win32 환경에서도 GM을 사용해서 CPU 사용량을 줄이는 일은 매우 가치가 있습니다.
PM 은 CPU 시간을 낭비할 뿐 아니라, 운영체제가 idle time 에 할 일도 막아버리므로 범용 메시지 루프에서는 사용되어서는 안됩니다.
하지만 PM 은 작업 스레드를 사용하지 않고 배경 작업을 하고자 할 때 유용합니다.
(MFC의 OnIdle() 이 바로 PM을 사용해서 구현되었습니다)
왜냐면 PM 을 사용해서 메시지 큐에서 메시지를 꺼내오지 않고 메시지가 있는지 없는지 확인하는 것도 가능하기 때문입니다.
메시지가 없다면 필요한 배경 작업을 하면 되겠죠..
일반적인 패턴은 다음과 같습니다.
= 1 번 =
// Improved PeekMessage() loop for(;;) { while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) return TRUE; TranslateMessage(&msg); DispatchMessage(&msg); } if (IfBackgroundProcessingRequired()) BackgroundProcessing(); else WaitMessage(); // Will not return until a message is posted. }
= 2번 =
// Another improved PeekMessage() loop for (;;) { for (;;) { if (IfBackgroundProcessingRequired()) { if (!PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) break; } else GetMessage(&msg, NULL, 0, 0, 0); if (msg.message == WM_QUIT) return TRUE; TranslateMessage(&msg); DispatchMessage(&msg); } BackgroundProcessing(); }
출처 : http://blog.naver.com/rayofuth
- 안내
- 궁금한 점을 댓글로 남겨주시면 답변해 드립니다.