1

ストップウォッチよりも正確な「睡眠」方法はありますか? または、ストップウォッチ クラスをより正確にする方法はありますか? .NET である必要はなく、C++ である場合もありますが、どの言語でも正確に 1 ミリ秒の精度が必要です。それ以上はいらない。プログラムを 300 ミリ秒「スリープ」させたい場合、少なくともほとんどの場合、300 ミリ秒スリープさせたいとします。

現在私は使用しています:

Dim StopWatch As New StopWatch
StopWatch.Start
Do
Loop Until StopWatch.ELapsed.Milliseconds >= 300
StopWatch.Stop

5 回実行した結果は、306、305、315、327、304 でした。

もっと走らせてもそのままでした。

スレッドとプロセスの優先度を「リアルタイム」/「高」に設定しました。

4

3 に答える 3

5

StopwatchクラスにはプロパティがありますIsHighResolution。「true」が返される場合は、High Performance Event Timer(HPET)を使用しています。可用性はハードウェアとOSによって異なります。これを使用すると、非常に正確に時間を測定できます。しかし!Windows(通常のLinux)はリアルタイムOSではありませんが、プリエンプティブマルチタスクを使用します。OSが必要だと考えるときはいつでも、現在のスレッドon holdに他の作業を実行させ、しばらくするとreturnスレッドに移動して続行させます。これswitchがループ内のどこかで発生した場合でも、正しい時間を測定しますが、それには時間が含まれていinactivtyます。

Windowsではtime slice15〜30ミリ秒であるため、299ミリ秒後にスレッドが一時停止され、15〜30ミリ秒後に元に戻る可能性があります。そしてそれはあなたが見る効果です。ストップウォッチは正確です。それはあなたが予期していなかったものを測定するだけです。

克服する方法:あなたはできません。言ったように:WindoesはリアルタイムOSではありません!プロセスに「リアルタイム」の優先順位を割り当てた場合でも。

于 2012-12-17T08:01:16.977 に答える
1

あなたが見ているものは完全に正常です。遅延が正確に300msになることはなく、常にそれ以上になります。スリープ自体は正確ですが、実際の遅延は、オペレーティングシステム、およびオペレーティングシステムと並行して実行されている他のプロセスによって異なります。

于 2012-12-16T23:41:07.403 に答える