6

我将从事一个项目,该项目需要(相当)准确的时间标记来自自定义硬件的传入 RS232 串行和网络数据。由于数据将来自许多独立的硬件来源,我需要对所有数据进行时间戳,以便可以将其校正/插值到标称时间点。

我的直接操作只是使用内置的 Now 命令来设置时间戳,但是快速的 Google 似乎表明这只会精确到大约 50 毫秒左右。

不幸的是,我读得越多,我就越困惑。关于 GetTickCount 和 QueryPerformanceCounter 似乎有很多相互矛盾的建议,由于当今的多核处理器和 CPU 节流而变得复杂。我还看到了推荐使用 Windows 多媒体计时器的帖子,但我似乎找不到任何代码片段来执行此操作。

所以,谁能给我建议:

1)“现在”的准确性如何。

2) 是否有简单、精度更高的替代方案。

注意:我希望将时间戳记在 10 毫秒内,我并不是在寻找这样的计时器,只是一种更好的时间戳方法。这将在 Windows 7 32 位低功耗微型 PC 上运行。如果有什么不同,我将使用 Delphi XE 或 Delphi 2007。

4

1 回答 1

10

根据文档,Now仅精确到最接近的秒数:

尽管 TDateTime 值可以表示毫秒,但 Now 仅精确到最接近的秒。

尽管如此,看看当前的实现,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 环境中运行时,您的应用程序/线程可能会在不同的时间获得处理器片,这取决于系统的繁忙程度以及您的应用程序/线程与运行在 Windows 中的所有其他线程的优先级。系统。

于 2013-01-29T00:54:49.047 回答