我将要开展一个项目,该项目需要(相当)准确地为来自定制硬件的传入RS232串行和网络数据加盖时间戳.由于数据来自多个独立的硬件源,我需要为所有数据加时间戳,以便可以对其进行校正/插值到标称时间点.
我的直接虽然只是使用内置的Now命令来设置时间戳,但是快速谷歌似乎表明这只能准确到大约50毫秒左右.
不幸的是,我读的越多,我就越困惑.在GetTickCount和QueryPerformanceCounter上似乎存在许多相互矛盾的建议,由于当今的多核处理器和cpu限制而引发复杂化.我也看过推荐使用Windows多媒体计时器的帖子,但我似乎无法找到任何代码片段来执行此操作.
那么,任何人都可以告诉我:
1)’现在’的准确度如何.
2)是否有简单,更高精度的替代方案.
注意:我希望时间戳到10毫秒内,我不是在寻找一个计时器,只是一个更好的时间戳方法.这将在Windows 7 32位低功耗微型PC上运行.如果它有任何区别,我将使用Delphi XE或Delphi 2007.
解决方法
根据文档,Now仅精确到最接近的秒:
Although TDateTime values can represent milliseconds,Now is accurate only to the nearest second.
尽管如此,看看当前的实现,Now和GetLocalTime windows API一样准确.
begin System.SysUtils.FormatSettings.LongTimeFormat := 'hh:mm:ss.zzz'; for I := 1 to 5000 do Writeln(TimeToStr(Now())); end.
当我从命令行project1> times.txt执行此控制台程序时,在Windows 7 64位机器中,我得到一个连续29毫秒的文件(文件中没有人丢失).
您必须面对在Windows环境中运行的事实,您的应用程序/线程可能会在两者之间获得不同时间的处理器片,具体取决于系统的繁忙程度以及应用程序/线程的优先级与在其中运行的所有其他线程的优先级.系统.