0

だから私は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
}

この例では、すべてのメッセージが処理されますか、それともこのループ構造により、フレームごとに1つのメッセージのみが処理されますか?

一度に1つのメッセージのみを処理する場合、すべてのメッセージが確実に処理されるように、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
}
4

2 に答える 2

3

トップメッセージのみを扱います。は、 1 つのMSGメッセージに関する情報を保持する構造体であり、orを呼び出したときに入力されます。前者はブロッキング関数です。次に、その 1 つのメッセージに関する情報を に渡します。GetMessagePeekMessageDispatchMessage

ループ内で他の処理を行う前にメッセージ キュー全体を処理する場合は、その部分をループで囲む必要があります。

于 2012-10-26T18:03:56.527 に答える
2

DispatchMesasgeメッセージキューとは関係ありません。渡されたメッセージのみを処理します。メッセージキューからメッセージを削除する実際の機能はPeekMessage1つのメッセージのみを削除またはピークするため、whileループを使用してすべてのメッセージを処理する必要があります待ち行列に

于 2012-10-26T18:10:18.663 に答える