家・車以外で、人生で一番奮発した買い物

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のスリープを解除させるにはどうしたらよいのでしょうか?

A 回答 (1件)

ヘルプには



>スレッドがメッセージキューをチェックする関数を呼び出した後、
>指定した種類の未読の入力がキューの中に存在するときにこの関数を呼び出すと制御が戻りません。

ということなんで、直前に破棄してるのがWM_USER~WM_USER + 10だけだからじゃないんですか?


というか、なんで普通にメッセージループみたいにGetMessage使わないの?
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/11/19 11:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報