Win32消息泵,DispatchMessage()是否处理​​整个消息队列或只是顶部消息?

时间:2012-10-26 18:02:20

标签: c++ winapi loops message message-pump

所以我一直在阅读Win32消息泵,我很好奇,如果DispatchMessage()函数处理整个消息队列,还是只处理队列顶部的消息?

例如,我看过如下的循环:

while(true) 
{

    MSG  msg;

    if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        if (msg.message == WM_QUIT) 
        {
            break;
        } 
        else 
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    } 

    do 
    {   
    } while (clock.getTimeDeltaMilliseconds() < 1.66f); // cap at 60 fps

    // run frame code here
}

在这个示例中,每个消息都会得到处理,或者这个循环结构是否导致每帧只处理一条消息?

如果它一次只处理一条消息,我是否应该将if(PeekMessage)语句更改为while循环以确保处理所有消息?:

while(true) 
{

    MSG  msg;

    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        if (msg.message == WM_QUIT) 
        {
            return;
        } 
        else 
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    } 

    do 
    {   
    } while (clock.getTimeDeltaMilliseconds() < 1.66f); // cap at 60 fps

    // run frame code here
}

2 个答案:

答案 0 :(得分:3)

它只处理热门消息。 MSG是一种结构,用于保存有关一条消息的信息,当您调用GetMessagePeekMessage时,该消息会被填充,前者是阻止功能。然后,您将有关一条消息的信息传递给DispatchMessage

如果要在循环中执行任何其他操作之前处理整个消息队列,则应将该部分包含在循环中。

答案 1 :(得分:2)

DispatchMesasge与消息队列无关,它只处理您传递给它的消息,从消息队列中删除消息的实际函数是PeekMessage,它只删除或查看一条消息,所以你是对的,你应该使用while循环来处理队列中的所有消息

相关问题