Итак, я читал о насосе сообщений 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
это структура, которая содержит информацию о один сообщение, заполняемое при звонке GetMessage
или же PeekMessage
первый является блокирующей функцией. Затем вы передаете эту информацию об одном сообщении DispatchMessage
,
Если вы хотите обработать всю очередь сообщений, прежде чем что-либо еще делать в цикле, вы должны заключить эту часть в цикл.
DispatchMesasge
не имеет никакого отношения к очереди сообщений, он только обрабатывает сообщение, которое вы передаете ему, фактическая функция, которая удаляет сообщение из очереди сообщений PeekMessage
и это только удалить или посмотреть одно сообщение, так что вы правы, вы должны использовать while
цикл для обработки всех сообщений в очереди