0

所以我一直在阅读 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
}
4

2 回答 2

3

它只处理最上面的消息。MSG是一个保存有关一条GetMessage消息的信息的结构,当您调用or时填充PeekMessage,前者是一个阻塞函数。然后,您将有关一条消息的信息传递给DispatchMessage.

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

于 2012-10-26T18:03:56.527 回答
2

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

于 2012-10-26T18:10:18.663 回答