一个连续更新,高精度的时间供应器
2006-07-20 11:38:26 来源:WEB开发网本文示例源代码或素材下载
本篇文章假定你熟悉 C++ 和 Win32 API
概要
从 Windows NT 里获得的时间戳(Timestamp),根据你所使用的硬件,其最大精度为 10 到 15 毫秒。但是, 有时候你需要时间标签频繁事件时,获得更高的精度更能令人满意。举个例子,如果你要与线程打交道,或者以间隔不低于 10 毫秒的频率实现某些其它任务时该怎么办?为了获得更好的精度,建议的方法包括使用性能计数器和系统时间一起去计算更小的时间增量。然而使用性能计数器技术有其自身的问题。本文将揭示一种可行的途径来克服该方法固有的局限。
你为什么会对获得小于1毫秒精度的系统时间感兴趣?在我工作期间,我发现有必要去确定我的进程里不同线程执行引发的事件的顺序。还需要把这些事件同绝对时间相 关联,但注意到系统时间的实际精度是不会超过10毫秒粒度的。
在本文随后的内容中,我将解释该系统时间精度的限制,解决的步骤,以及某些一般缺陷。例子程序的实现可以从本文开始链接处下载。这些文件的源代码是在 Visual C++? 7.1 和 Windows? XP 专业版下编写测试的。在编写本文时,我频繁地提到 Windows NT® 操作系统家族(Windows NT 4.0, Windows 2000, 或者 Windows XP)产品,而不是某一个特定的版本。 本文中用到的 Win32? APIs 的参数类型及用法,参见 MSDN library/Platform SDK 文档。
究竟谁有这样的需求?
最近我用“Windows NT millisecond time resolution”作为关键字在 Internet 上搜索了一番, 得到了 400 多个满足条件的结果。其中大多数是讨论如何获得高于10毫秒精度的系统时间,或者是如何让一个线程的休眠时间小于10毫秒。本文我将专注于为什么获得一个高于10毫秒精度的系统时间 会如此困难。你可能认为用 GetSystemTime API 很容易解决问题,这个 API 函数返回一个SYSTEMTIME 结构,该结构包含一个 wMilliseconds 域,在 MSDN 文档中说它保存 当前的毫秒时间。但实际上并不象这么简单。那么用 GetSystemTimeAsFileTime 获取 100 纳秒的精度如何呢?就让我们从一个小试验 开始吧:尝试重复获取系统时间,将它格式化并输出到屏幕上(见 Figure 1 )。
赞助商链接