Помпа сообщений 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
}

В этом примере обрабатывается ли каждое сообщение или эта структура цикла вызывает обработку только одного сообщения на кадр?

Если он имеет дело только с одним сообщением за раз, должен ли я заменить оператор 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

Решение

Это касается только верхнего сообщения. MSG это структура, которая содержит информацию о один сообщение, заполняемое при звонке GetMessage или же PeekMessageпервый является блокирующей функцией. Затем вы передаете эту информацию об одном сообщении DispatchMessage,

Если вы хотите обработать всю очередь сообщений, прежде чем что-либо еще делать в цикле, вы должны заключить эту часть в цикл.

3

Другие решения

DispatchMesasge не имеет никакого отношения к очереди сообщений, он только обрабатывает сообщение, которое вы передаете ему, фактическая функция, которая удаляет сообщение из очереди сообщений PeekMessage и это только удалить или посмотреть одно сообщение, так что вы правы, вы должны использовать while цикл для обработки всех сообщений в очереди

2

По вопросам рекламы [email protected]