Помпа сообщений 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 цикл для обработки всех сообщений в очереди

Другие вопросы по тегам