c++ - Win32 消息泵,DispatchMessage() 是处理整个消息队列还是只处理顶部消息?

标签 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
}

最佳答案

它只处理顶部消息。 MSG 是一个包含one 消息信息的结构,当你调用GetMessagePeekMessage 时填充,前者是一个阻塞函数。然后,您将关于一条消息的信息传递给 DispatchMessage

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

关于c++ - Win32 消息泵,DispatchMessage() 是处理整个消息队列还是只处理顶部消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13092043/

相关文章:

c++ - 使用多个着色器时的驱动程序错误

delphi - 实际上在 services.msc 打开时**删除**服务

c - ZwQueryDirectoryFile 行为

python - 如何遍历嵌套列表以从 1 到 5 对每个列表进行编号 :

c# - C# for 循环中的两个计数器

c++ - "Don' t Care"multiset 键中的字段

c++ - Qt 4.7.4 QPropertyAnimation 不工作

Matlab:在循环中更新最大计数不起作用

c++ - 如何使用 OpenGL 和 GLUT 渲染 3d .obj 文件? (Mac OS X,XCode 4)

C++ 头重新定义 (ws2ipdef.h)