是否可以使用查询性能计数器(Win32,C)获取时间戳?

时间:2013-07-21 06:05:04

标签: c++ winapi timer

是否可以使用Query性能计数器(Win32,C ++)获取时间戳?如果不是在Win32-C ++应用程序上获取时间戳的最准确方法是什么?

2 个答案:

答案 0 :(得分:2)

QueryPerformanceCounter只是一个计数器,它在机器开机并计数时包含一些值。它根本没有连接到挂钟。

如果足够好,

GetSystemTimeGetSystemTimeAsFileTime的准确度大约为15毫秒 如果您仅定位到Windows 8,则GetSystemTimePreciseAsFileTime非常精确。

如果您需要Windows 8之前的高分辨率时间,您可以尝试使用系统时间和性能计数器的混合方法,如下所示:Implement a Continuously Updating, High-Resolution Time Provider for Windows

如果您使用的是C ++ 11,那么您可能也希望查看std::chrono::system_clockstd::chrono::high_resolution_clock

答案 1 :(得分:0)

你在硬件中有哪些时钟源?

如果你想要准确性,就不能使用QueryPerformaceCounter,因为它以CPU时钟为准,这很快但不准确。

中断定时器:该定时器产生频率为1 kHz的中断,可能非常精确。

HPET:1 MHz定时器。这是你想要使用的那个。

音频接口采样时钟:此时钟的频率取决于音频采样率,但中断频率取决于音频缓冲区大小,通常需要的时间长于某个ms。

我已成功使用Waitable Timer以40 ms的间隔驱动屏幕捕获程序。有关演示,请参阅:http://www.youtube.com/watch?v=SLad8-IRtg4。音频轨道由音频输出到音频输入的模拟反馈记录,表明帧时钟与音频设备的采样时钟保持同步。相同的时钟应该在1毫秒内工作,但是当机器忙于渲染3d内容并将视频帧压缩为PNG时不会: - )

要使用音频设备时钟,请记录到虚拟缓冲区。在Windows 7上,使用新的音频架构来获得尽可能小的缓冲区大小。在较旧的系统上,您需要内核流。如果你想要音频功能,你也可以将一个函数发生器插入你的wave设备,并有一个循环,它返回一个基于trigg条件的时间戳。这样你就会低于1毫秒。