C++ Win32消息泵,DispatchMessage()处理整个消息队列还是仅处理顶部消息?
所以我一直在读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; }
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开发了。为什么帧定时代码与消息循环在同一线程中?