私は現在、同じコードを1秒間に正確に100回実行するアプリケーションを作成しようとしています。.NETFrameworkの組み込みタイマーを使用していくつかのテストを行いました。System.Threading.Timerクラス、System.Windows.Forms.Timerクラス、およびSystem.Timers.Timerクラスをテストしました。それらのどれも私がやろうとしていることに対して十分に正確ではないようです。PerformanceCountersについて知り、現在、アプリケーションにそのようなものを実装しようとしています。ただし、アイドリング時にプログラムがCPUのコア全体を占めることに少し問題があります。1秒間に100回アクティブにするだけで済みます。私のループは次のようになります。
long nextTick, nextMeasure;
QueryPerformanceCounter(out start);
nextTick = start + countsPerTick;
nextMeasure = start + performanceFrequency;
long currentCount;
while (true)
{
QueryPerformanceCounter(out currentCount);
if (currentCount >= nextMeasure)
{
Debug.Print("Ticks this second: " + tickCount);
tickCount = 0;
nextMeasure += performanceFrequency;
}
if (currentCount >= nextTick)
{
Calculations();
tickCount++;
nextTick += countsPerTick;
}
}
ご覧のとおり、ほとんどの場合、プログラムはwhileループを絶えず実行することにより、Calculations()の実行を待機しています。これを防ぐ方法はありますか?プログラムが実行されるコンピューターの速度を落としたくありません。System.Thread.Thread.Sleepも残念ながらかなり「不正確」ですが、他に解決策がない場合は使用しても問題ありません。
私が基本的に求めているのは、これです。無限ループのCPU負荷を軽減する方法はありますか?特定の時間を正確に待つ他の方法はありますか?