私は40ms(25Hz)ごとにネットワークパケットを生成するスレッドを持っています。これは無限ループです(停止するように言われるまで)、私はthread.sleepを使用しています。DateTimeの漂流 - 2時間後の奇妙な問題
パケットを作成するとき、値の1つは現在のGPS時刻で、DateTime.UtcNow
を使用して閏秒を追加します。
これは正常に動作しますが、2時間後には5秒遅れて時間とともに変動します。
私はSymmetrom GPS Time Serverを持っていて、NTPクライアントとしてソフトウェアを使用しています.PCの累積ドリフトは約1.2秒ですオフにしてNTPに同期しない)。
誰もが何がうまくいかないと思いますか?私はthread.sleepが完璧なタイミングではなく、WindowsがRTOSではないことを知っていますが、ドリフトは理にかなっていません。
私は何らかのプロプライエタリとITARの問題にコードを投稿することはできませんが、私は大まかなアウトラインを投稿することができます:
while(!abort) {
currentTime = DateTime.UtcNow + leapSeconds ;
buildPacket(currentTime);
stream.Write(msg, 0, sendSize);
//NetworkStream Thread.Sleep(40);
}
私はWindows 7でだとビジュアル・スタジオに2010
あなたは 'Sleep(40)'を使っています。あなたはパケットを構築するのにかかる時間を説明しましたか? –
コードを教えてください。 –
私は5秒がそれほど悪くはないと言いたいと思います。 Thread.Sleep([それは本当に完璧ではありません](http://stackoverflow.com/a/1303708/2316200)の非常に小さな不正確さでさえ、時間とともに大きな間隔につながります。 Windows.Timersではさらに悪化します。約30分後に10秒後に消えます。 –