我有一个线程每40毫秒(25赫兹)生成一个网络数据包,它是一个无限循环(直到被告知停止),我正在使用thread.sleep.
当我构建数据包时,其中一个值是当前的GPS时间,使用DateTime.UtcNow并添加闰秒.
这在我开始时工作正常,但随着时间的推移漂移,大约2小时后,它落后了5秒.
我有一个Symmetrom GPS时间服务器,我正在使用他们的软件作为NTP客户端,它说PC上的累积漂移大约是1.2秒(我注意到的大多数是在PC关闭而不同步时漂移到NTP).
任何人都知道什么是错的?我知道thread.sleep不是完美的计时,而Windows不是RTOS,但漂移没有意义,丢帧会.
由于一些专有和ITAR问题,我无法发布代码,但我可以发布一个粗略的大纲:
while(!abort) {
currentTime = DateTime.UtcNow + leapSeconds ;
buildPacket(currentTime);
stream.Write(msg, 0, sendSize);
//NetworkStream Thread.Sleep(40);
}
Run Code Online (Sandbox Code Playgroud)
我在Windows 7并使用Visual Studios 2010.
我认为发生这种情况是因为 while 循环执行的时间是 40 毫秒(您的睡眠)+ 执行构建数据包的代码所需的时间。
您是否尝试过使用 System.Threading.Timer ?这样,您的代码将在一个单独的线程中执行,然后在计算您的时间的线程中执行。但是,我认为性能不足以让您的实时应用程序长时间运行。
| 归档时间: |
|
| 查看次数: |
258 次 |
| 最近记录: |