- ベストアンサー
メッセージループを調べすぎてCPU使用率が100%にならないのはどうしてですか?
WINDOWSプログラミングでは、WinMainでメッセージループをつくりますが、一般にこのようなwhile文をコンピュータが一生懸命グルグルまわしたりしてCPU使用率が100%になったりしないのはどうしてですか。 入力が大してないときに、無駄にメッセージループをまわらせるのが悪いような気がします。
- みんなの回答 (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% にならないのです。 ・以上。
お礼
なるほどGetMessage()がちゃんとそういう仕様になっていたのですね。 大変よくわかりました。 どうもありがとうございました。