Delphi的“现在”时间戳有多准确

前端之家收集整理的这篇文章主要介绍了Delphi的“现在”时间戳有多准确前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我将要开展一个项目,该项目需要(相当)准确地为来自定制硬件的传入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一样准确.

进行快速测试,它显示Now返回时钟中每毫秒的值,例如:

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环境中运行的事实,您的应用程序/线程可能会在两者之间获得不同时间的处理器片,具体取决于系统的繁忙程度以及应用程序/线程的优先级与在其中运行的所有其他线程的优先级.系统.

猜你在找的Delphi相关文章