Помпа сообщений Win32, DispatchMessage() обрабатывает всю очередь сообщений или только верхнее сообщение?
Итак, я читал о насосе сообщений 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
}
In this example would every message get processed or does this loop structure cause only one message to be processed per frame?
If it does deal with only one message at a time, should I change the if(PeekMessage) statement to a while loop to ensure all messages are handled?:
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
}
2 ответа
Это касается только верхнего сообщения. MSG
это структура, которая содержит информацию об одном сообщении, заполняется при вызове GetMessage
или же PeekMessage
первый является блокирующей функцией. Затем вы передаете эту информацию об одном сообщении DispatchMessage
,
Если вы хотите обработать всю очередь сообщений, прежде чем что-либо еще делать в цикле, вы должны заключить эту часть в цикл.
DispatchMesasge
не имеет никакого отношения к очереди сообщений, он только обрабатывает сообщение, которое вы передаете ему, фактическая функция, которая удаляет сообщение из очереди сообщений PeekMessage
и это только удалить или посмотреть одно сообщение, так что вы правы, вы должны использовать while
цикл для обработки всех сообщений в очереди