4

保留中のメッセージが残っているウィンドウが破棄されるとどうなりますか?

次のシナリオを検討してください。

A、B、C の 3 つのスレッドがあります。スレッド C はウィンドウを所有しています。

スレッド A と B はSendMessage、メッセージをウィンドウに投稿するために使用します。A からのメッセージが最初に到着します。C が A からのメッセージを処理している間、C は を使用してそのウィンドウを破棄しますDestroyWindow

スレッド B からのメッセージはどうなりますか? スレッド B による呼び出しはSendMessage戻りますか?

これは内部でどのように機能しますか?

4

2 に答える 2

1

原則として、あなたがやろうとしていることは安全ではありません。スレッド B が既にメッセージを送信したことをスレッド C が保証する方法はありません。スレッド B がメッセージを送信する前にウィンドウが破棄され、その間にウィンドウ ハンドルが再利用された場合、スレッド B は別のアプリケーションにある可能性のある間違ったウィンドウにメッセージを送信してしまう可能性があります。

ベスト プラクティスは、 DestroyWindow を呼び出す前に、特定のウィンドウ ハンドルが無効になったことをすべてのスレッドに通知することです。

ただし、実際には、ハンドルが間違ったタイミングで再使用されるリスクは非常に低くなります。事前に他のスレッドに通知することが妥当でない場合、結果として問題が発生する可能性は低くなります。私が知る限り、ドキュメンテーションではこれを明示的に約束していませんが、メッセージがスレッド C のメッセージ キューで待機することはないと kicsit が主張していることは正しいと思います。

于 2012-11-09T00:35:09.680 に答える
1

MSDNによると、DestroyWindow「[...]、スレッド メッセージ キューをフラッシュします [...]」。これがメッセージを処理することを意味するのか、メッセージをダンプすることを意味するのかわからなかったので、試してみました。後者であることが判明しました。保留中のポストされたメッセージはすべてキューから削除され、無視されます。キューに入れられていないメッセージについては、私のテストでは、保留中のSendMessage呼び出しが返され、最後のエラーが に設定されましたERROR_INVALID_PARAMETER - 87 (0x57)

于 2012-11-05T14:29:06.820 に答える