3

一般的な質問は、複数のメッセージを別のワーカー スレッドから Windows メッセージ ポンプに投稿した場合、送信した順序で宛先に表示されるかどうかです。つまり..

::PostMessage(m_hUsers, WM_BULKPROCESS, 0, 0);
// ... some processing here ...
::PostMessage(m_hUsers, WM_BULKDONE, 0, 0);

m_hUsers は、ワーカー スレッドからメッセージを送信するウィンドウへのハンドル (HWND) です。したがって、WM_BULKPROCESS は常にウィンドウに最初に表示される (したがって、そのダイアログ クラスのハンドラーによって処理される) か、それとも順不同になる可能性がありますか。 ?

4

4 に答える 4

5

いくつかの例外(WM_PAINTなど)がありますが、通常、メッセージの順序は維持されます。メッセージが間違った順序で表示された場合にマウス入力を理解しようとするイメージング!

GetMessageからの引用

この呼び出し中に、システムは保留中のキューに入れられていないメッセージ、つまり、SendMessage、SendMessageCallback、SendMessageTimeout、またはSendNotifyMessage関数を使用して呼び出し元のスレッドが所有するウィンドウに送信されたメッセージを配信します。次に、指定されたフィルターに一致する最初のキューに入れられたメッセージが取得されます。システムは内部イベントも処理する場合があります。フィルタが指定されていない場合、メッセージは次の順序で処理されます。

Sent messages
Posted messages
Input (hardware) messages and system internal events
Sent messages (again)
WM_PAINT messages
WM_TIMER messages
于 2011-09-15T18:41:59.763 に答える
2

ウィンドウメッセージはキューに保存されます。したがって、FIFOメカニズムに依存することができます。

于 2011-09-15T18:40:28.157 に答える
1

メッセージポンプに(意図的であろうとなかろうと)異なる方法でメッセージを具体的にディスパッチするコードがない限り、それらは必要です。たとえば、2つのメッセージを選択し、それらを順不同でディスパッチします。通常、プログラマーは、キューから取得した順序でメッセージごとにDispatchMessageを呼び出します。

于 2011-09-15T18:40:32.857 に答える
0

問題は同期であり、メッセージ キューではないと思われます。コードでワーカー スレッド プロシージャの複数回の呼び出しが許可されている場合は、ワーカー スレッドのどの「インスタンス」がメッセージを送信しているかを知るために、これをより厳密に管理する必要があります。

一度に 1 つのワーカー スレッドしか実行していないこと、または m_hUsers ウィンドウ ハンドルが BULKPROCESS と BULKDONE の間で変更されないように保護されていることを確認しましたか?

SendMessage は、メッセージが処理されるまでブロックされるため、BULKDONE の管理に役立ちます。これにより、ワーカー スレッドを呼び出すコードがワーカー スレッドの呼び出しを同期し、別のワーカー スレッドを呼び出す前に 1 つのワーカー スレッドが終了したことを真に認識できるようになります。Postmessage はブロックしませんが、ワーカー スレッドの時間に敏感な部分が `// ... ここで何らかの処理を行っている ... Windows メッセージを送信していないことを覚えておいてください。

于 2011-09-16T08:49:27.843 に答える