これは私のコードで、タイマとしてQueryPeformanceCounter
を使用しています。無限ループでCPU使用率を減らすための正確な方法
//timer.h
class timer {
private:
...
public:
...
double get(); //returns elapsed time in seconds
void start();
};
//a.cpp
void loop() {
timer t;
double tick;
double diff; //surplus seconds
t.start();
while(running) {
tick = t.get();
if(tick >= 1.0 - diff) {
t.start();
//things that should be run exactly every second
...
}
Sleep(880);
}
}
Sleep
がなければ、このループは無限にt.get()
高いCPU使用率の原因となるたびに呼び出すに行くだろう。そのため、約880ミリ秒間スリープ状態にして、必要ではないうちにt.get()
を呼び出さないようにします。
私が上記のように、私は現在Sleep
を使っていますが、私が心配するのはSleep
の精度です。私はどこかで、プログラムが一時停止する実際のミリ秒数が20〜50ミリ秒に変わるかもしれないと読んだ。なぜなら、パラメータを880
に設定した理由だ。私はできるだけCPU使用量を減らしたい。可能であれば、990ミリ秒以上を一時停止します。EDIT:そしてさらに1000ミリ秒未満すべてのループの間に。最善の方法は何でしょうか?
行くための最善の方法は、Windowsでの正確なタイミングに頼る終了するだろう -
次に、より良いあなたのニーズに合わせて睡眠のメカニズムのいくつかの選択肢があります。そのことを実際には意識して設計されていませんでした。タイトなループと全くスリープしていなくても、1秒に達するのと同じように、Windowsが別のタスクに切り替えるのを妨げるものは何もありません。 –
[SetTimer APIの使い方]の複写が可能です。(0120-998-301) – user3528438
これは良い戦略ではありません。あなたのコードの実行を停止する*良い理由。あなたはそれを*始めるのに十分な理由を与えたいと思っています。 Sleep()を正確にすることでできることは、timeBeginPeriod()を呼び出します。 SetThreadPriority()を呼び出すことでより良い理由を与えてください。 timeSetEvent()は、待ち時間を調整できるかなり安定したタイマーを得るための良い方法ですが、非同期であることに注意してください。あなたはそれを1ミリ秒より正確にすることは決してありません。そして、あなたは決してそれが*常に* 1ミリ秒と仮定することはできません。カーネルとそのデバイスドライバは常に最初に来ます。 –