私はwhileループを10 msごとに実行しようとしています。 whileの中のコードはかなりシンプルなので、実行するのに時間がかかりません。 whileの末尾にSleep()
関数を使用する以外に方法はありますか?もっと正確な何か?Xミリ秒ごとに実行できるようにする
私はVisual Studioを使用しています。
私はwhileループを10 msごとに実行しようとしています。 whileの中のコードはかなりシンプルなので、実行するのに時間がかかりません。 whileの末尾にSleep()
関数を使用する以外に方法はありますか?もっと正確な何か?Xミリ秒ごとに実行できるようにする
私はVisual Studioを使用しています。
これは十分に正確であると言います。コードを正確に10msごとに実行したい場合は、コードの実行時間を測定してから10ms - <length of execution in ms>
のスリープを実行する必要があります。
最高の精度で測定するには、少なくともsystem_clockレート以上で動作するhigh_resolution_clock fromを使用できます。 http://www.cplusplus.com/reference/chrono/high_resolution_clock/
WindowsではSetTimerを使用できます。
しかし、特にコールバックがクラスにアクセスする必要がある場合は、これが複雑すぎる可能性があります。あなたは正確に10ミリ秒ごとに、スピンループでより良い待ち、それを実行する必要がない場合は、std::this_thread::sleep_for
std::this_thread::sleep_for(std::chrono::milliseconds(10));
スリーピングは何かが10秒ごとに実行されることを保証するものではありません。 Windowsのタイマーのデフォルト精度は15.6msで、それでもスレッドの切り替えによって遅延が発生する可能性があります。 –
良い点、既定の精度についてはわかりませんでした。 – pierobot
をチェックアウトする必要があります。擬似コード:
while (your_condition)
{
var t = curTime;
do_what_you_need;
while (curTime - t < 10);
}
代わりのstd::this_thread::sleep_for
、それは遅延のこのタイプのsleep_until
を使用するのが最適です。ループ内の他のコードは、(ただし些細なかではない)取っているどのくらいこれが自動的に考慮されます:
#include <chrono>
#include <iostream>
#include <thread>
int
main()
{
using namespace std::chrono;
auto next = steady_clock::now();
while (true)
{
std::cout << "hi\n";
next += 10ms;
std::this_thread::sleep_until(next);
}
}
両方Sleep
とWaitable Timers使用解像度がデフォルトの順であるので、舞台裏スレッドタイムスライスは10〜20msです。より高い解像度が必要な場合は、マルチメディアタイマーを調べる必要があります。 The documentationは1ms以上の分解能を約束します。手にあるSetTimer
/WM_TIMER
のインターフェイスは15.6msの固定解像度を持つように見える、と他の人は言っている。
もう一つの高解像度タイミングインターフェイスはPerformance Counterですが、何かを待つのではなく、それらをクエリすることしかできないため、アイドル状態の待ちループ(回転)が発生します。
なぜ10msですか?デフォルトのウィンドウタイマの解像度は15.6 msです。なぜもっと必要なのですか?あなたはおそらくアニメーションを制御しようとしていますか?それはマルチメディアを扱う正しい方法ではありません。 –