所以我一直在阅读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
}
答案 0 :(得分:3)
它只处理热门消息。 MSG
是一种结构,用于保存有关一条消息的信息,当您调用GetMessage
或PeekMessage
时,该消息会被填充,前者是阻止功能。然后,您将有关一条消息的信息传递给DispatchMessage
。
如果要在循环中执行任何其他操作之前处理整个消息队列,则应将该部分包含在循环中。
答案 1 :(得分:2)
DispatchMesasge
与消息队列无关,它只处理您传递给它的消息,从消息队列中删除消息的实际函数是PeekMessage
,它只删除或查看一条消息,所以你是对的,你应该使用while
循环来处理队列中的所有消息