質問: cpu資源をなるべく消費しないでイベントを待機する こんにちは。 vc++2008exressを使用して、以下のようなプログラムを作成したいと思います。 初心者で、どうやって作成すれば良いのか悩んでおります。 参考になるものなどありましたら、ご教授ください。 windowsアプリケーション win32api メッセージループ内でwaitforsingleobjectなどのイベントを待機する関数を使用して イベントを待つようにしたいのですが メッセージループ内でメッセージも待機できイベントも待機できるような方法はないでしょうか? 今のところ、実現はしておりませんが検討しているのは メッセージ待機用のスレッドを作成して、getmessageで待機して メッセージがきたら、setevent関数でメインのメッセージループ内の waitforsingleobjectを返す。 また、別のメッセージ以外のイベントを監視するスレッドを作成して waitforsingleobjectで監視してイベントが来たら、さきと同じイベントを setevent関数を使用しメインのメッセージループ内のwaitforsingleobjectを返す。 という感じでメッセージとイベントをメッセージループ内で監視するようにするしか 分かりません。 その他、簡単な関数で実現可能なものなどありませんでしょうか? waitformultiobjectsとか、msgwaitformultiobjectsやら調べてみましたが、いまいち使い方が。。。。 また、スレッドは監視イベントが来るたびに終了させた方がよいのでしょうか? それでは、またスレッド作成を繰り返すので効率悪い気がします。 無限ループで監視させた方が良いのではと思いますが、cpu資源的には・・・。 というようなことで悩んでおります。 どうか、ご教授ください。よろしくお願いします。
回答: メッセージで通知するのはやめたほうがいいですね。ワークスレッドが100ms毎にメッセージが投げるのにたいして、メインスレッド側はguiの処理であり、メッセージハンドラで時間がかかるかもしれません。 その場合に、メッセージがキューに溜り、いざ動き出すと同じメッセージを短時間のうちにいくつも処理することになります。 だれが表示更新タイミングを作るかという課題になりますね。 受信したデータを画面に表示するようなアプリであれば、メッセージのタイマーを使用して定期的にそれまでに受信したデータを吸出しに行くような実装でもいいかもしれないですね。シンプルな実装になります。 受信したデータについてはどうお考えですか。 stlのqueue クラスを派生して、スレッドセーフなクラスを作れば、綺麗に収まると思います。 そのクラスのオブジェクトに、ワークスレッドからはpush, メインスレッドからはpopです。 クラス化、汎用化よりも、まずはデータの流れ、目的にあった動作についての分析、設計をして、そこが固まってから、どうクラス化するかを考えていったほうがいいと思います。