티스토리 뷰

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 번 =

// 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
댓글
안내
궁금한 점을 댓글로 남겨주시면 답변해 드립니다.