2011-01-22 8 views
0

私はプログラムキュー内の複数のスレッドが通信するのを助けるためにメッセージキュー(ウィンドウで提供)を使用しています。しかし、プログラム内のすべてのスレッドに一度にメッセージを送信する必要があります。これを行う関数はありますか?すべてのスレッドにメッセージを送信できますか?

+0

なぜですか?それらはすべて同じ瞬間に処理を始めることができないので、PostThreadMessageをN回呼び出すことの問題は何ですか? – Tergiver

+0

私は時々可変数のスレッドを持つことになるので、どのスレッドに送るべきか把握するのは面倒です。 – Mark

+0

HWND_BROADCASTに投稿しようとしましたか?私はスレッドがそれを受け取るためにどのような条件が満たされなければならないのか正確にはわかりません。各スレッドにトップレベルのウィンドウが必要な場合がありますが、私は確信していません。 HWND_BROADCASTを使用する場合は、必ずRegisterWindowMessageを使用してください。 – Tergiver

答えて

1

Windowsでは、プレーンスレッドメッセージ(ウィンドウなし)は信頼できません。トレースがなくても飲み込まれ、スレッドで処理できない状況があります。したがって、ウィンドウターゲットのメッセージは常にそのウィンドウのウィンドウプロシージャによって処理されるため、メッセージターゲットのスレッドごとにトップレベルウィンドウを持つことができます。そのスレッドに対して可視ウィンドウが必要ない場合は、メッセージ専用のウィンドウ(親のあるHWND_MESSAGE)にすることができます。

スレッドごとにウィンドウを作成したら、EnumWindowsまたはEnumChildWindowsでウィンドウを列挙し、必要なものにメッセージを送信することができます。スレッドメッセージウィンドウのリストを保持し、それぞれにメッセージを送信することもできます。プロセス内のすべてのスレッドにメッセージを送信する簡単な方法はありません。

+0

メッセージポンプが動作していないため、システムモーダルループ中にそれらが見逃されます。目に見えるウィンドウがなく、MessageBoxまたはDialogBoxを呼び出さない場合、システムモーダルループは実行されません。 – Tergiver

+0

悲しいことに、それらはメッセージポンプを含む唯一の機能ではない(したがってスレッドメッセージを落とす)。 IIRCでCOMコンポーネントを使用すると、たとえば、状況によってスレッドメッセージが落ちることがあります。 –

+0

ああ、COM ..決してファンだった。疫病を避けてください。 COMはまだ死んでいない? ;) – Tergiver

関連する問題