【发布时间】:2013-04-30 23:29:08
【问题描述】:
我将从事一个项目,该项目需要对来自自定义硬件的传入 RS232 串行和网络数据(相当)准确的时间戳。由于数据将来自多个独立的硬件来源,我需要为所有数据加上时间戳,以便将其校正/插值到标称时间点。
虽然我只是使用内置的 Now 命令来设置时间戳,但快速的 Google 似乎表明这只会精确到大约 50 毫秒左右。
不幸的是,我读得越多,我就越困惑。关于 GetTickCount 和 QueryPerformanceCounter 似乎有很多相互矛盾的建议,由于当今的多核处理器和 CPU 节流而变得复杂。我还看到了推荐使用 Windows 多媒体计时器的帖子,但我似乎找不到任何代码 sn-ps 来执行此操作。
那么,谁能给我建议:
1) “现在”的准确度。
2) 是否有简单、准确度更高的替代方案。
注意:我希望将时间戳记在 10 毫秒内,我并不是在寻找这样的计时器,只是一种更好的时间戳方法。这将在 Windows 7 32 位低功耗微型 PC 上运行。如果有什么不同,我将使用 Delphi XE 或 Delphi 2007。
【问题讨论】:
-
存储任何数据的延迟将远远超过系统时钟的准确性,不是吗?即使您在单独的线程中运行每个连接,接收数据/存储数据/获取下一个数据点也将远远超过 50 毫秒,IMO。 (IIRC,Windows 中时钟计时器的延迟大约为 18 毫秒,所以我怀疑您是否可以获得比使用系统时钟更精细的时间戳。)高频计数器可以变得更精细(作为链接的链接在右侧显示的“相关* 列表顶部”更细化,但执行起来很慢。(@TLama 的链接。)
-
这可能会有所帮助:thedelphigeek.com/2007_11_01_archive.html 不要错过最后关于从 Vista 开始的 Windows 版本的部分。
-
这个问题让我想到了How soon is Now?
-
由于所有标准方法(getTickCount、计时器)都不足以满足您的需求(我猜),您应该切换到性能计数器。最终将它与现在结合起来......例如
-
别让我在你面前扮演莫里西,赫弗南。生活是猪圈。