我有一个线程每40毫秒(25 Hz)生成一个网络数据包,这是一个无限循环(直到被告知停止),并且我正在使用thread.sleep。
构建数据包时,其中一个值是使用DateTime.UtcNow
并加上the秒的当前GPS时间。
当我开始时,这可以很好地工作,但是随着时间的流逝,大约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);
}
我在Windows 7中并使用Visual Studios 2010。
最佳答案
我认为发生这种情况是因为while循环执行的时间是40毫秒(您的 sleep )+执行构建数据包代码所需的时间。
您是否尝试过使用System.Threading.Timer?这样,您的代码将在一个单独的线程中执行,而不是在计算您的时间。但是,我认为性能不能使您的实时应用程序长时间运行。
关于c# - DateTime漂移-2小时后出现奇怪的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21101090/