我知道默认是每个tick 15.6毫秒,但有些人可能会更改它,然后一次又一次地更改回去,因此我需要轮询当前值以执行有效的QueryPerformanceCounter同步。
所以是否有API方法可以获取计时器分辨率?
顺便说一下,我在使用C++。
Windows计时器分辨率是通过隐藏的API调用提供的:
NTSTATUS NtQueryTimerResolution(OUT PULONG MinimumResolution,
OUT PULONG MaximumResolution,
OUT PULONG ActualResolution);
NtQueryTimerResolution由本地Windows NT库NTDLL.DLL导出。
常见硬件平台报告 ActualResolution 为156,250或100,144;旧平台可能报告更大的数字;当支持HPET(高精度事件定时器)或恒定/不变TSC时,新系统可能返回156,001的ActualResolution。
timeBeginPeriod(n)
的调用反映在 ActualResolution 中。
更多详细信息请参见此答案。
这并不会有所帮助,因为在你进行校准时,另一个进程可以在此期间更改它。
这属于"如果你不能战胜他们,就加入他们"的范畴。在开始校准之前调用timeBeginPeriod(1)
确保你拥有一个已知的速率,没有人可以更改它。获得改进的计时器精度肯定也是有益的。
请注意,你很难做得比QueryPerformanceFrequency()更好。除非你校准了很长时间,否则时钟速率不够高,无法给你额外的精度,因为你永远无法测量超过+/- 0.5毫秒。计时器事件也不会以毫秒精度传递,它可以任意延迟。如果你进行长时间校准,则GetTickCount64()足够好。
QueryPerfomanceFrequency
),但在操作期间它们不会重复进行该校准。旧版本(例如XP)甚至认为这是一个恒定的固定值(例如3579545个tick/s),但实际上并非如此。所有这些都给了我们很大的改进空间。进行校准可以帮助解决这个问题。 - ArnoWINAPI 函数 GetSystemTimeAdjustment