2016-04-14 19 views
0

SendMessage & PostMessageとすると、メッセージはSend/PostMessageと同じ順番で処理されます。しかし、documentによれば、SendMessageは現在のスレッドが正しいものであればその関数を実行します。WindowsのメッセージキューはFIFO形式でメッセージを処理していますか?

呼び出し元のスレッドによって指定されたウィンドウが作成された場合は、ウィンドウ プロシージャがサブルーチンとしてただちに呼び出されます。

だから、次のような場合には:

PostMessage(currentThreadWindow, postMsg, ...) // line 1 
SendMessage(currentThreadWindow, sendMsg...) // line 2 

sendMsgpostMsg前に処理されます。

メッセージはSendMessagePostMessageに転送されるので、注文を受け取りますか?

+0

すでに注文が維持されていない例を挙げています。あなたの質問が何であるか分かりません。 –

+0

@Raymond Chen、メッセージの順序についての詳細なコメントはありますか?注文には多くの論理があります。たとえば、ポスターがターゲットスレッド自体でない場合、オーダーは保持されますか。 – ZijingWu

+0

スレッドを越えている場合、保証はさらに少なくなります。あなたの例のメッセージはどちらの順序でも受け取ることができます。唯一保証されるのは、メッセージキューに優先順位の高いメッセージがない場合、その優先順位の低いメッセージがディスパッチされることです。 – IInspectable

答えて

3

メッセージはSendMessagePostMessageに転送されますか?

あなたが呼び出し元のスレッドが所有するウィンドウにメッセージを投稿/送信されている場合は、すでに、この質問への答えを知っている:SendMessageへの呼び出しが完全にメッセージキューをバイパスし、そう、すぐにウィンドウプロシージャを呼び出しますこのメッセージは常に投稿されたメッセージの前に処理されます。

スレッド境界を越えている場合、これ以上の保証はありません。インバウンドのクロススレッドメッセージは、現在メッセージキューにあるメッセージの前に送出されますが、呼び出しスレッドがプリエンプトされるタイミングを制御することはできません。 PostMessageSendMessageの呼び出しの間にプリエンプトされると、送信されたメッセージは送信されたメッセージの前に処理される可能性があります。これらの呼び出しの間に呼び出し元のスレッドがプリエンプトされていない場合でも、保証はありません。投稿されたメッセージまたは送信されたメッセージが最初に処理されるかどうかは、同時に実行される受信スレッドに依存します。

スレッドをさらに複雑にするために、スレッドは他の時にもメッセージを受信できます(When can a thread receive window messages?を参照)。アウトバウンドSendMessage -callの結果を待つ間、スレッドは依然としてバインドされていないクロススレッドメッセージを受信します。つまり、次のメッセージに進む前に、メッセージが全体として処理されるという事実に頼ることさえできません。あなたのウィンドウプロシージャは、再入場の準備が必要です。

あなたが信頼できるのは、投稿された複数のメッセージの相対的な順序が維持されているということです。 2つのメッセージを投稿すると、それらのメッセージの最初のものが2番目のメッセージの前に処理されます。これらのメッセージは、依然として他の投稿されたメッセージに散在することがあります。

関連する問題