複数のスレッドでイベント待機させて
1つのトリガーで全てのイベントをONにしたいです。
スレッドは数が決まっていないので
あらかじめイベントを作ることが出来ませんので
1つのイベントハンドルで実現できたらうれしいです。
そのようなイベントってどう実現したらいいのでしょうか?
例:(イベントを使ったイメージ)
イベント発生側
SetEvent(hEvent); //1つのイベントをSet
イベント待機側(複数スレッド)
WaitForSingleObject(hEvent, INFINITE); //全スレッドが同時に実行
//実行させたい処理
イベントを作成するときに手動リセットに設定し、
SetEventの代わりにPulseEventを使うとよいでしょう。
ありがとうございます。
使ってみます。
>Note This function is unreliable and should not be used. It exists mainly for
backward compatibility. For more information, see Remarks.
とあるのでPulseEventを使うのはどうかと。
この機能はあてにならない?使うべきでない?
困りましたね…他に方法ないんでしょうか…
> 複数のスレッドでイベント待機させて
> 1つのトリガーで全てのイベントをONにしたいです。
またOFFに戻す必要が無いのなら、SetEvent で問題ないのでは。
スレッド数が決まっていなくてもスレッドの管理はしないといけないのでしょうし、
メインスレッドがサブスレッドの管理をするのでしょうからきちんとスレッドを管理する
仕組みを作ってそれぞれにイベントを投げればよいと思いますけれど。
イベントの口を一つにした所でスレッド側がまったく同時にイベントを処理するわけでは
ありませんし、
どうせスレッドの管理をするならあわせて通知用のイベントハンドルも管理すれば済むと
思いますけれど。
追加情報とか
http://blogs.msdn.com/oldnewthing/archive/2005/01/05/346888.aspx
http://blogs.sqlpassj.org/yas/archive/2004/02/03/351.aspx
http://blogs.sqlpassj.org/yas/archive/2004/02/12/523.aspx
> PulseEventはWindows NT 3.1以降、ずっと問題だとされてる物ですね。
> 書籍Advansed Windows のかなり古い版(当時はAdvanced Windows NT)から
> 駄目と書かれてます。
> 互換性ってのは怖いもので一回そう実装しちゃったら変えられないってのが
> 線としては有りそうですが。
確かに手持ちの Advanced Windows にもありましたが、「使うな」と書いてあるだけ
で、回避策までは載っていませんでした。
>またOFFに戻す必要が無いのなら、SetEvent で問題ないのでは。
OFFに戻す必要が在ります。
作ってる機能はサーバーで発生した情報を
接続されてるクライアント全てに送るものです。
接続数と同じ数のスレッドがあります。
処理の流れは、
サーバーで情報発生(ほぼ1秒毎に発生)
↓
各スレッドに1つのイベント発生
↓
各スレッドは情報を取り出してクライアントに送信
↓
イベント待ちに戻る
>スレッド数が決まっていなくてもスレッドの管理はしないといけないのでしょうし、
...略
>思いますけれど。
通知用のイベントハンドルを各スレッドに渡すことにしました。
最初こうしようと思ったのですが1つで出来たら楽だろうなって…
皆さんレスありがとうございました。