我将要开展一个项目,该项目需要(相当)准确地为来自定制硬件的传入RS232串行和网络数据加盖时间戳。由于数据来自多个独立的硬件源,我需要为所有数据加时间戳,以便可以对其进行校正/插值到标称时间点。
我的直接目的只是使用内置的Now命令来设置时间戳,但是快速的Google似乎表明这只能准确到大约50毫秒左右。
不幸的是,我读的越多,我就越困惑。在GetTickCount和QueryPerformanceCounter上似乎存在许多相互矛盾的建议,由于当今的多核处理器和CPU限制而引发复杂化。我也看过推荐使用Windows多媒体计时器的帖子,但我似乎找不到任何代码片段来做这件事。
所以,有人可以告诉我:
1)“现在”的准确程度如何。
2)是否存在简单,更高精度的替代方案。
注意:我希望时间戳到10毫秒内,我不是在寻找一个计时器,只是一个更好的时间戳方法。这将在Windows 7 32位低功耗微型PC上运行。如果它有任何不同,我将使用Delphi XE或Delphi 2007。
答案 0 :(得分:10)
根据文件记录,Now仅与最近的第二个一样准确:
虽然TDateTime值可以表示毫秒,但现在仅精确到最接近的秒。
尽管如此,看看当前的实现,现在和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环境中运行的事实,您的应用程序/线程可能会在两者之间获得不同时间的处理器片,具体取决于系统的繁忙程度以及应用程序/线程与所有其他线程的优先级在系统中运行。