• ベストアンサー

メッセージループを調べすぎてCPU使用率が100%にならないのはどうしてですか?

WINDOWSプログラミングでは、WinMainでメッセージループをつくりますが、一般にこのようなwhile文をコンピュータが一生懸命グルグルまわしたりしてCPU使用率が100%になったりしないのはどうしてですか。 入力が大してないときに、無駄にメッセージループをまわらせるのが悪いような気がします。

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★アドバイス >CPU使用率が100%になったりしないのはどうしてですか。  100% にならないのはメッセージがキューという場所にメッセージが溜まるまで  一時停止(スリープ)をしている状態にあるからです。  例えば次のようなループを組んでみて下さい。  while ( 1 ){   /* 何かの処理 */   Sleep( 1 );  }  これを GUI のどこかに記述しても CPU 使用率は 100% にはなりません。  理由は Sleep() 関数で 1 ミリ秒だけループを一時停止しているからです。 ・でもこの Sleep() 関数の記述がないと無限ループを組んでいますので  CPU 使用率が 100% になります。  WinMain のメッセージ・ループにある GetMessage() はメッセージが  キューに入るまで Sleep() 関数と同じく停止しています。つまり処理を  呼び出しもとの WinMain のメッセージ・ループに返しません。  このためCPU使用率は 100% にならないのです。 ・同様な機能で PeekMessage() 関数があります。  こちらを GetMessage() の代わりにメッセージ・ループに記述すると  キューにメッセージがなくても呼び出し元に制御を返しますので  CPU使用率が 100% になってしまいます。 >入力が大してないときに、無駄にメッセージループをまわらせるのが悪いような気がします。  無駄なときは OS がキューという場所にメッセージを格納しないため GetMessage() は  何かのメッセージがキューという場所に溜まるまで一時停止(スリープ)状態にあるから  無限ループしても CPU使用率が 100% にならないのです。 ・以上。

参考URL:
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdllpro/html/_win32_Sleep.asp
string
質問者

お礼

なるほどGetMessage()がちゃんとそういう仕様になっていたのですね。 大変よくわかりました。 どうもありがとうございました。