2011-06-24 6 views
0

STAスレッド同期を実行するのが最良でしたか?MsgWaitForMultipleObjectsExは、MFCアプリケーションのメインSTAスレッドをデッドロックします。

私はメインと2番目のSTAスレッドを持つダイアログベースのMFCアプリケーションを持っています。メインのUIスレッドでCOMオブジェクトを作成しました。

私は2番目のスレッドからCOMインターフェイスを呼び出します。メインスレッドでは、メインスレッドが進む前に2つ目のスレッドが終了していることを確認するために、ループを使用してスレッドを待ちます。このループはMsgWaitForMultipleObjectsEx(timout = 500)ループを呼び出します。

私はすぐに待たされました。その後、私は、MFCメッセージポンプ、AfxInternalPumpMessage()、呼び出しをブロックするのに役立ちますが、デッドロック状況ではまったく助けていないことに気付きました。

次に、Peek/Translate/DispatchMessageコードを待機ループに追加して、すべて作業しました。

Peek/Translate/DispatchMessageループを手作業でコーディングしなければ、STAスレッドの同期はまったくできないようです。待っている通話があなたにデッドロックします。次に、STAスレッドを同期するための最良の方法または標準的な方法は何ですか?

ありがとうございます!

+0

なぜMsgWaitForMultipleObjectsExを呼び出す必要がありますか? 2番目のスレッドでは、完了したら最初のスレッドにメッセージを投稿してみませんか? – wj32

答えて

0

メッセージループの実行を停止する待ち時間はありませんが、実際にはデッドロックが発生します。解決方法は、待機ループとメッセージループ処理をインターリーブすることです。少し待ってから、保留中のメッセージをすべて処理して繰り返します。

+0

MsgWaitForMultipleObjectsExは、メッセージがキューに追加されたときに戻るように構成できる待機時間ではありません。また、Wait関数GetMessageはありませんか? –

+0

@David Heffernan:いいえ、その関数のMSDN記述を慎重に読めば、メッセージで中断されていないことがわかります。 – sharptooth

+1

私はそれを間違って読んでいると思いますが、QS_ウェイクマスクは何をしますか? –

1

おそらくCoWaitForMultipleHandlesをお探しですか?

呼び出し側は、シングルスレッド アパートに存在する場合、CoWaitForMultipleHandlesはCOMモーダルループに入り、そしてスレッドの メッセージループは、スレッドのメッセージ フィルタを使用して メッセージをディスパッチしていきます。スレッドに対してメッセージフィルタが登録されていない場合は、デフォルトのCOM メッセージ処理が使用されます。

関連する問題