timeGetTime似乎非常适合查询系统时间.但是,它的返回值仅为32位,因此每49天左右就会回绕一次.
在调用代码时检测翻转并不太难,但它增加了一些复杂性,并且(更糟)需要保持状态.
是否有一些替换timeGetTime没有这个环绕问题(可能通过返回64位值),并具有大致相同的精度和成本?
什么平台?
如果你在Vista或更高版本上运行,你可以使用GetTickCount64(),或者GetTickCount64()从GetTickCount()计时器中合成你自己的...
我在我的博客上处理翻转问题GetTickCount()并合成一个GetTickCount64()不支持它的平台,关于测试非平凡的代码:http: //www.lenholgate.com/blog/2008/04/practical-testing-17 --- A-全新approach.html
小智 5
除非您需要为超过49天的活动计时,否则您可以安全地忽略环绕.只需总是从当前timeGetTime()中减去前一个timeGetTime(),并且您将始终获得一个准确的增量测量时间,即使是在环绕中 - 只要您是总持续时间低于49天的计时事件.这一切都有效,因为计算机内的无符号模块化数学运算方式.
// this code ALWAYS works, even with wrap-around!
DWORD dwStart = timeGetTime();
// provided the event timed here has a duration of less than 49 days
DWORD dwDuration = timeGetTime()-dwStart;
Run Code Online (Sandbox Code Playgroud)
提示:查看TimeBeginPeriod(1L)以提高timeGetTime()的准确性.
但是......如果你想要一个64位版本的timeGetTime,这里是:
__int64 timeGetTime64() {
static __int64 time64=0;
// warning: if multiple threads call this function, protect with a critical section!
return (time64 += (timeGetTime()-(DWORD)time64));
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果此函数每49天至少调用一次,则此函数将无法正确检测环绕.
不,跟踪翻转需要状态。它可以很简单,只需在每次回调时递增您自己的 64 位计数器即可。
想要以低至 1 毫秒的分辨率跟踪长达 49 天的时间段是很不寻常的。您必须担心经过这么长时间后准确性仍然存在。下一步是使用时钟,GetTickCount(64)、GetSystemTimeAsFileTime 的分辨率为 15.625 毫秒,并通过时间服务器保持准确。
| 归档时间: |
|
| 查看次数: |
11441 次 |
| 最近记录: |