1

WinAPI の奇妙な動作に遭遇したので、私にはそう思われます。私のプログラムでは、ウィンドウのタイマーを設定しています

::SetTimer(window_handle, timer_id, 10, NULL);

ウィンドウ プロシージャで WM_TIMER メッセージを処理します。必要な CPU 時間を短縮するため::WaitMessageに、メッセージ ポンプでも関数を使用しています。私がそこに関数を持っている限り::WaitMessage、しばらくすると WM_TIMER メッセージが来なくなることがわかりました。メッセージポンプから削除すると、すべてが期待どおりに機能します。

ここで、タイマーの設定が間違っているのか、それとも の標準的な動作なのか疑問に思います::WaitMessage。MSDN と Web を検索しても、このような理由がわかりませんでした。

私が使用するメッセージポンプは次のとおりです。

while(true) {
    if(GetMessage(&msg, _window_handle, 0, 0) > 0) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    } else { 
        return 0; 
    }

    WaitMessage();
}

誰かが私のためにこれを片付けてくれることを願っています。

4

2 に答える 2

7

はい、これはランダムにタイマー メッセージの処理に失敗します。WaitMessage() の非常に厳しい規則は、呼び出す前にメッセージ キューを空にする必要があるということです。空でない場合、キューに残っているメッセージはすべて「既読」としてマークされ、WaitMessage() はそれらを無視します。

したがって、失敗のシナリオでは、キューに2 つのメッセージ、たとえばマウス メッセージとタイマー メッセージがあります。マウス メッセージは表示されますが、タイマー メッセージはそのままです。保留中のメッセージを処理していないため、追加のタイマー メッセージは生成されません。GetMessage + WaitMessage の組み合わせは非常に面倒です。代わりに PeekMessage を使用する必要があります。

WaitMessage() を削除するだけです。ここでは何の役にも立ちません。

于 2012-04-13T13:10:49.373 に答える