• ベストアンサー

WINAPIでのスレッド

ゲームを作ろうとってC言語でプログラミングをしていたのですが、スレッドを立てて30フレーム/秒になるように InvalidateRect()を行っていたのですが、CPU使用率が100%になって、デバックをやっていると開発ソフトがとまってしまうのですが、どうすればいいのでしょうか? その前に http://www.it-engineer.jp/main/programing/sample/vc17.html のサンプルをそのまま見て作ったのですが、画面上は何も起きませんでした。 どこかスレッド生成自体に問題があるのでしょうか? 開発環境は CPU:Pentium M 1400Mhz メモリ:256MB OS:WindowsXP Pro 開発環境:VisualC++6.0 です。 よろしくおねがいします

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

  • ベストアンサー
  • ishitani
  • ベストアンサー率25% (10/40)
回答No.3

> 無限ループ自体がいけないのでしょうか? いけない事はありませんが、CPU利用率が100%になってしまいます。 そうしますと電気を食います(ノートなら相当熱くなるのがわかります)し、低プライオリティのアプリケーションがロックします。 スレッドは優先順位が上のものが動作している限り優先順位が下のものには制御がいきません。 どのAPIがOSに制御を返すのか、という事を意識しながらコーディングすることをお勧めします。 Sleep()やWaitFor--Object()、select()などの関数を上手く使ってください。

haruna1987
質問者

お礼

ありがとうございます。 勉強不足を痛烈に感じました。 ゼロから組みなおしたら動くようになり、開発環境のフリーズもほとんどなくなったのでもう一度書籍を漁って勉強しなおしてみます。 ご回答ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • ishitani
  • ベストアンサー率25% (10/40)
回答No.2

やはり処理が見えないのでなんともいえないのですが、開発ソフトが止まるということは無限ループを使っているのですね。 スレッドを使ってゲームを作るのであれば、Sleep等を使って時間調整するようにすれば如何でしょうか。 funcThreadLoop() { 今の時間の計測 ゲームの処理() 使った処理時間=今の時間-さっきの時間 Sleep(フレーム間隔-使った時間) } WinAPIのSleep()は完全にCPUを開放しますので、この間他の処理も可能です。(開発ソフトも動作できます) 少し違うのですが、似たような処理を行っているソフトを紹介しておきます。

参考URL:
http://www001.upp.so-net.ne.jp/ishi/win32/dd/index.html
haruna1987
質問者

お礼

ご回答ありがとう御座います。 ソースを載せるのを忘れていました。 すみません。 サンプルのアドレス、ありがとうございます。 参考にします。 お二人の意見を聞いていて思ったのですが、無限ループ自体がいけないのでしょうか? 出来ればご回答お願いします

すると、全ての回答が全文表示されます。
回答No.1

ソースを見ないとなんとも言えないのですが、 30フレーム/秒のルーチンはどうなっていますか? もしかして無限ループで時間を取得して、一定時間になったら画面描画とかしていませんか?

haruna1987
質問者

お礼

ご回答ありがとう御座います。 ソースを載せるのを忘れていました。 すみません。 別スレッドで無限ループをしているのですが、どこがいけないのか分からないままなのですが、ゼロから組みなおしたら上手く動くようになりました。

すると、全ての回答が全文表示されます。

関連するQ&A