Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Win32消息泵,DispatchMessage()处理整个消息队列还是仅处理顶部消息?_C++_Winapi_Loops_Message_Message Pump - Fatal编程技术网

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

C++ Win32消息泵,DispatchMessage()处理整个消息队列还是仅处理顶部消息?,c++,winapi,loops,message,message-pump,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; }

所以我一直在读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
}
while(true)
{
味精;
if(peek消息(&msg,NULL,0,0,PM_-REMOVE))
{
如果(msg.message==WM\u退出)
{
打破
} 
其他的
{
翻译信息(&msg);
发送消息(&msg);
}
} 
做
{   
}while(clock.gettimedeltamillseconds()<1.66f);//上限为60 fps
//在这里运行帧代码
}
在本例中,是否会处理每条消息,或者该循环结构是否会导致每帧只处理一条消息

如果它一次只处理一条消息,我是否应该将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
}
while(true)
{
味精;
while(peek消息(&msg,NULL,0,0,PM_-REMOVE))
{
如果(msg.message==WM\u退出)
{
返回;
} 
其他的
{
翻译信息(&msg);
发送消息(&msg);
}
} 
做
{   
}while(clock.gettimedeltamillseconds()<1.66f);//上限为60 fps
//在这里运行帧代码
}

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


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

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


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

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

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

,这样我就可以在第二个示例中使用while(peek消息(…)语句来迭代队列中的每条消息了?这是推荐的方法吗?@Pondwater,您必须将
TranslateMessage
DispatchMessage
调用也包含在循环中,以便从队列中提取的每条消息都得到实际处理,而不仅仅是最后一条。我以前在那里见过循环,我认为这是合乎逻辑的,因为滞后于用户界面通常是个坏主意。所以我可以在第二个示例中使用while(peek message(…)语句来迭代队列中的每条消息?这是推荐的方法吗?@Pondwater,您必须将
TranslateMessage
DispatchMessage
调用也包含在循环中,以便从队列中提取的每条消息都得到实际处理,而不仅仅是最后一条。我以前见过这个循环,我认为它是合乎逻辑的,因为滞后于用户界面通常是个坏主意。我已经多年没有做过Windows开发了。为什么帧定时代码与消息循环在同一线程中?我已经多年没有做过Windows开发了。为什么帧定时代码与消息循环在同一线程中?