dポイントプレゼントキャンペーン実施中!

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

A 回答 (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 …
    • good
    • 1
この回答へのお礼

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

どうもありがとうございました。

お礼日時:2007/12/13 09:42

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