• 締切済み

WinAPI「MsgWaitForMultipleObjectsについて」

Windowsプログラミング初心者です。 MsgWaitForMultipleObjectsを使ってメッセージ待ちの処理をウェイトさせることでCPUの付加を抑えたいと考えて、以下のような処理を作りました。 4行目のPeekMessageで自分のウィンドウにユーザ定義のメッセージが届いたらループを抜け、届かなかった場合には8行目のMsgWaitForMultipleObjectsで次のメッセージが届くまでスリープしたいと思っています。 01 while(TRUE) 02 { 03 /* hWnd宛てのユーザ定義メッセージの有無を確認 */ 04 if(PeekMessage(msg, hWnd, WM_USER, WM_USER + 10, PM_REMOVE)){ 05 break; /* メッセージがあればwait処理終了 */ 06 } 07 08 if(MsgWaitForMultipleObjects(0, NULL, TRUE, INFINITE, QS_POSTMESSAGE) == -1){ 09 return ICCJZD_NG; 10 } 11 } これを動かすと、メッセージが届いているはずなのにMsgWaitForMultipleObjectsのスリープが解除されず、固まっているウィンドウ上をクリックするとスリープが解除されてユーザ定義のメッセージを受け取ってbreakします。 スリープ時間をINFINITEに設定していますが、これは可能な限りループを抑止したいからです。 ユーザ定義のメッセージが届いたら即MsgWaitForMultipleObjectsのスリープを解除させるにはどうしたらよいのでしょうか?

みんなの回答

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

ヘルプには >スレッドがメッセージキューをチェックする関数を呼び出した後、 >指定した種類の未読の入力がキューの中に存在するときにこの関数を呼び出すと制御が戻りません。 ということなんで、直前に破棄してるのがWM_USER~WM_USER + 10だけだからじゃないんですか? というか、なんで普通にメッセージループみたいにGetMessage使わないの?

freshjive
質問者

お礼

GetMessageよりもMsgWaitForMultipleObjectsのほうが拾うメッセージが少ないと判断したので使用しています。

関連するQ&A