2012-10-26 381 views
0

所以我一直在阅读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 
} 

在这个例子中会得到处理的每个消息或执行此环结构原因仅一个消息,以每帧被处理?

如果它在一个时间只处理一个消息,我应该改变,如果(的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

我还没有在_years_中完成Windows开发。为什么帧定时代码与消息循环在同一线程中? – Chad

回答

3

只用最优惠的条件信息。 MSG是一种结构,它保存有关一个消息的信息,当您拨打GetMessagePeekMessage时填充消息,前者为阻止功能。然后,您将有关该消息的信息传递给DispatchMessage

如果您想在循环中执行任何其他操作之前处理整个消息队列,则应该将该部分放在循环中。

+0

因此,我可以在第二个exmplae中使用语句(PeekMessage(...))来遍历队列中的每条消息?这是推荐的方法吗? – kbirk

+0

@Pondwater,你还必须在循环中包含'TranslateMessage'和'DispatchMessage'调用,以便从队列中取出的每条消息都被实际处理,而不仅仅是最后一个。我之前看到过这个循环,而且我认为这是合乎逻辑的,因为落后于用户界面通常是一个糟糕的主意。 – chris

2

DispatchMesasge无关与消息队列,它仅处理您传递给它从消息队列中删除消息的消息,实际功能PeekMessage,它只是删除或偷看一个消息,那么你是对的,你应该使用一个while循环来处理队列中的所有消息