2009-04-29 4 views
6

Iは、whileループの終わりにC#のThread.sleep直ちに

Thread.Sleep(5); 

下のコードを使用してい覚醒。反復の間に5msの遅延を試してみる。

時には16msの間スリープします。これは私が理解して受け入れるのは、CPUがスレッドを処理する時期に依存するからです。しかし、一度それが次の反復を目覚めたら、睡眠呼出しの直後に目を覚ますようです(私はタイムスタンプでロギングしています)。このような短いスリープインターバルを使用することに問題はありますか?それはゼロとして扱われますか?

+0

Thread.Sleep()を呼び出す場所にコードを投稿できますか? –

+0

気にしないでください。タイムスタンプロギングコードをポストするだけです。 ;] – bzlm

+1

5ミリ秒は、特にタイムスタンプを使用している場合は、エラーの余白の範囲内にあるようです。 StopWatchを使用してもう一度お試しください。まだこの現象が見られる場合はお知らせください。 –

答えて

21

ほとんどの最新のマシンでは、DateTime.UtcNowの解像度は約10-15msです(NT 3.5から約10msだと書かれていますが)。より高い解像度のタイミングが必要な場合は、Stopwatchクラス、具体的にはStopwatch.GetTimestamp()を参照してください。

また、ストップウォッチは、使用可能な場合にのみ高解像度タイマを使用します(実行時にStopwatch.IsHighResolutionが通知します)。そうでなければ、DateTime.UtcNow.Ticksに戻ります。

4

おそらく、問題は単にタイマーの解像度が制限されていることです。たとえば10msごとに更新するだけであれば、5msが経過していても、いくつかの繰り返しで同じタイムスタンプが表示されます。

タイムスタンプを生成するために使用しているタイマーはどれですか?

0

これはどのようなシステムで実行していますか?小さな間隔は、プロセッサーとそれがサポートする解像度の高さによって異なります。タイマー自体の解像度が16msだったところで、ハンドヘルドでアプリを走らせました。したがって、ハードウェアに関連する可能性があります。期間を30ミリ秒に増やして試してみましょう。

1

NTカーネルで導入されたNTタイムスライシングが正しく覚えていて、XPと同じ方法でまだアクティブだった場合は、5msの周りで正しく動作します。私たちはリアルタイムのアプリケーションを構築していて、その問題に遭遇しました。一貫して5msの睡眠時間を得ることはできません。私たちが見つけたのは、時には10〜16ミリ秒、場合によってはミリ秒、場合によってはまれに5ミリ秒になるということでした。

私は5年前にこれらのテストを行っていましたが、それ以降は状況が変わった可能性があります。

関連する問題