• ベストアンサー

メッセージループについて

while(true) { if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { if(msg.message==WM_QUIT) break; DispatchMessage(&msg); if(!GetMessage(&msg,NULL,0,0)) { } } else { } これはpeekMessageがメッセージを取り出してメッセージがあったら if(msg.message==WM_QUIT) break; DispatchMessage(&msg); if(!GetMessage(&msg,NULL,0,0)) を実行して、GetMessage()で待機してもし、メッセージがWM_QUITならGetMessageにWM_QUITのメッセージを渡してメッセージが消えてPeekMessageはメッセージキューがないため、0を返し永遠にelseを繰り返すという認識でよろしいのですか? あと、while(true) { if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { if(!GetMessage(&msg,NULL,0,0)) { } if(msg.message==WM_QUIT) break; DispatchMessage(&msg); } else { } if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))がWM_QUITのメッセージで そしてメッセージが消えてGetMessageで待機状態になるということでよろしいのでしょうか?ご教授お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

> これはpeekMessageがメッセージを取り出してメッセージがあったら > if(msg.message==WM_QUIT)break; > DispatchMessage(&msg); > if(!GetMessage(&msg,NULL,0,0))を実行して、 > GetMessage()で待機して ここまでは字面的にはOK。 但し、Peekした時点で取り出したメッセージはキューから消えてます。 下記の書き方からすると、実は理解が怪しいのかも。 > メッセージがWM_QUITなら "GetMessageで取り出したメッセージが"なら、GetMessageが0を返すのでOKです。 (この時点でPeekは既に無関係) > GetMessageにWM_QUITのメッセージを渡してメッセージが消えて 意味が理解できませんでした。 ここでGetMesssageにWM_QUITのメッセージを渡すようなことはできません。 Peek/GetMessageの引数msgはシステムのキューからメッセージを取得するもので、 受け渡したりなどはできません。(キューに残すことは可能ですがそうもなっていません) このソースでは、PeekとGetでそれぞれ別のメッセージを消します。(各1つ、計2つキューから取り出されます) また、PeekMessageした結果はDispatchされないままに失われました。(普通に考えればバグ) > PeekMessageはメッセージキューがないため、 > 0を返し永遠にelseを繰り返すという認識でよろしいのですか? メッセージキューは、そのプログラムが動けばOSから勝手にがしがし追加されるでしょうから、 永久にelseということはないでしょう。根本的な動作が理解できていない状態でしょうか。 # このソースだと、空白の部分の実装にもよりますが、CPU使用率あがりそう。 # 誰が書いたソースですか?ゲーム用のサンプルコードとか読まれてますか? > if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))がWM_QUITのメッセージで 何を書かれているか不明ですが、否でしょう。 > そしてメッセージが消えてGetMessageで待機状態になる 何を書かれているか不明ですが、字面からの推測ではおそらく。 こちらも、普通に考えればバグってます。 何がしたいのか良く分からないコードです。 # 要求や省略部分の実装などにもよりますが、前回質問も含め、 # 不適切か不具合を含んだもの、注意して書くべきものなどを列挙されているような… # ずばり、目的は何で、何がされたいのでしょうか。 # ・ゲーム用のサンプルコードを読み漁っている? # ・試行錯誤しているがうまく動かない?

79562
質問者

お礼

ゲームプログラムのサンプルを試しここ変えたらどうなるかな?と打ってみたらこうなって、なぜGetMessageを入れたらこうなるのかな?そしてなぜこういう結果になったのかわからなくなったので質問させていただきました。

その他の回答 (5)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.6

>本のこと何ですけど、Win32API完璧マスタ(CQ出版)という本を読んでいます。調べたりするのですがそれでもわからなくて。。。 じゃあ、先ほど紹介した「APIで学ぶWindows徹底理解」を読んでみてはどうでしょう?この本はメッセージキューとかの仕組みが図入りで説明されてますので、イメージしやすいと思います。 http://software.nikkeibp.co.jp/software/backno/04apimook2.html APIの詳細は載っていないですが、OSの仕組みの解説は丁寧です。 アマゾンのレビューも悪くない評価です。 http://www.amazon.co.jp/API%E3%81%A7%E5%AD%A6%E3%81%B6Windows%E5%BE%B9%E5%BA%95%E7%90%86%E8%A7%A3%E2%80%95%E3%81%A7%E3%81%8D%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE-%E6%97%A5%E7%B5%8CBP%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E3%83%99%E3%82%B9%E3%83%88%E3%83%A0%E3%83%83%E3%82%AF-%E5%AE%89%E5%AE%A4-%E6%B5%A9%E5%92%8C/dp/4822228266

79562
質問者

お礼

わかりました。買ってみます。回答ありがとうございました。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.5

小言。 やたらと同じ質問を中途半端に締め切って質問するのは、「マルチポスト」に限りなく近いです。 http://help.okwave.jp/okwave/beginner/prohibition.html この掲示板は、直接関係の無い人でも質問内容と回答を参考にしてもらうのを主旨として運営されていますので、一つの質問で完結するのがベストな使い方です。 http://help.okwave.jp/okwave/beginner/netiquette.html マナー的には、やたら締め切るのも印象が悪いですね。 で一番悪いのが、ちゃんとWindowsAPIの本を読んだり資料を調べてないことです。 こう言うのとか http://wisdom.sakura.ne.jp/system/winapi/index.html こんなの http://software.nikkeibp.co.jp/software/backno/04apimook2.html ちゃんと読みましたか?

79562
質問者

お礼

すみませんでした。確かに締め切りすぎたかもしれないです。 本のこと何ですけど、Win32API完璧マスタ(CQ出版)という本を読んでいます。調べたりするのですがそれでもわからなくて。。。

回答No.4

一番最初の方への回答からして、 質問の動機が不純です。 MSDN見てください。

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.3

# もう一つ前に締め切り済みの質問もあったのですね…見落としてました。 GetとPeekの動作の違い、NOREMOVE/REMOVEの違い、 メッセージキューとは何ぞ、というところをまず理解しないといけないかと。 # ソースコードで処理一つ違えば意味が変わります。 # 先の質問とはREMOVE/NOREMOVE画異なっていたりしてますが、意図的ですか。誤記ですか。

79562
質問者

お礼

回答ありがとうございます。意図的です。メッセージキューから理解していなかったみたいですね。勉強し直します。

回答No.2

>>PeekMessageはメッセージキューがないため、0を返し永遠にelseを繰り返すという認識でよろしいのですか? PeekMessage(~~PM_REMOVE) としてるので、PeekMessage通過後はメッセージキューは消える。 DispatchMessage()でPeekMesssage()で拾って消したメッセージを 再送出してる。 それをGetMessageで拾う。 A.結論はこれだけ見てもメッセージキューが空なのかどうかはわかりません。 >そしてメッセージが消えてGetMessageで待機状態になるということでよろしいのでしょうか? PeekMessage(~~PM_REMOVE) としてるので、PeekMessage通過後はメッセージキューは消える。 GetMessageはメッセージキューが空ならメッセージがくるまで待機する。 メッセージが飛んできたらDispatchMessage()でGetMessageしたメッセージを 再送出してる。 A.メッセージキューが空なら待機します。 正直要点が何なのかわからないです。何をしたいのかさっぱり。 勉強レベルのようですが、書籍を見るなりなんなりしたほうが いいかもしれませんよ。 あとログ出し。これで一発でわかることを質問してます。

79562
質問者

お礼

回答ありがとうございます。あるサンプルを元に改造してみておかしいな?と思ったので質問させていただきました。 >DispatchMessage()でPeekMesssage()で拾って消したメッセージを >再送出してる。 >それをGetMessageで拾う。 だとWM_QUITを返してきたときif(msg.message==WM_QUIT)が通ると思うのですが、どうなのでしょうか?

関連するQ&A