所以我一直在阅读 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 消息信息的结构,当你调用GetMessage
或PeekMessage
时填充,前者是一个阻塞函数。然后,您将关于一条消息的信息传递给 DispatchMessage
。
如果您想在循环中执行任何其他操作之前处理整个消息队列,则应将该部分包含在循环中。
关于c++ - Win32 消息泵,DispatchMessage() 是处理整个消息队列还是只处理顶部消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13092043/