私のアプリケーションでは、クラス、継承などの OOP の機能を使用しました。CPU サイクルが 100% になるまで、アプリケーションでスレッドを使用していません。考えられる原因は何ですか?
3 に答える
最も可能性の高い理由は、無限ループです (Jogojapan で既に述べたように)。そして、それを見つける最善の方法は、デバッガーを使用して、CPU の使用率が高くなり始めたときにコードがスタックしている場所を確認することです)。
非常に複雑な「こと」を実行するのに長い時間がかかる関数を実行している場合を除いて、一時停止のないある種のループが原因である可能性があります。それを修正するようなものを探してください。OSに時間を与える関数を呼び出し、プログラムを「x」ミリ秒の間効果的に一時停止する関数do {...} while (!exit);
へのAPI呼び出しを入れる必要があります。sleep(x)
Windowsを使用している場合、これはループの最後に#include <windows.h>
配置することで実行できます。sleep(10);
「10」は任意です。ただし、小さい値はランダムに動作する傾向があり、グラフィックがたくさんある場合(30 fpsの場合)は33未満であれば問題ありません。また、主にクリックやメニューを含むイベント駆動型のものには100程度が適しています。
まず、CPU 使用率が 100% であることは、もちろん必ずしも問題ではありません。プロセスが IO などではなく多くの計算を実行する場合、100% の CPU 使用率は完全に健全であり、実際には望ましいものです。
しかし、実際に CPU サイクルを使用していると思われる場合は、これに対処するための一般的な戦略をいくつか示します。
そもそもそのような問題を引き起こす可能性が低いコードを記述してください。(入力範囲を十分にカバーする) 単体テストを使用し、過度に複雑な終了条件を持つループを回避します。(単純または標準的な状況では
std::for_each
、std::generate
などの組み込みアルゴリズムを使用すると、無限ループを回避するのにも役立ちます。)ログ メッセージを使用すると、ログを確認することで、何日も経った後でもプログラムの動作を追跡できます。大量のログ メッセージによる追加の計算負荷が心配な場合は、ログ メッセージを実装して、実行時またはコンパイル時のオプションをオンまたはオフにしたり、詳細レベルを選択したりできます。役立つさまざまなロギング フレームワークがあります (それらをリストする SO の質問もありますが、クローズされて削除される可能性があります)。
上記の方法で問題が解決せず、投稿で説明されているような状況になっている場合は、デバッガーを使用して、プロセスがスタックしているコードの部分を特定します。デバッガーでプログラムを数日または数週間実行できます。必要。CPU 使用率が 100% に達したら、中断してコールスタックを検査し、プロセスの場所を確認します。無限ループ (または同様の現象) は比較的高いレベルで発生する可能性があるため、ループが発生する場所を理解するには、スタックを上下に移動する必要がある場合があります。プロセスを続行して、後でもう一度中断することもできます。