根据MSDN GetTickCount API仅在系统未连续运行49.7天时返回系统已用时间。如果它的运行速度超过了它,它将返回0.
任何人都有这种事件的经验,这个API实际上在系统上返回0,运行时间超过49.7天?
我需要根据GetTickCount报告的值做出一些决定,如果我发现0,我会将其视为特殊情况并要求用户重启系统。
答案 0 :(得分:4)
当滴答计数翻转时,它会返回0
,但会继续计数。因此,您可以获得以下值序列:4294967295
,0
,1
,2
等等。与您的怀疑相反,滴答计数不会翻到0
,然后永远保留在那里。滴答计数在翻转后继续向上计数。
要求用户重启机器,因为你的程序无法计算过去2 32 似乎是一个相当弱的解决方案。你应该正确解决问题。也许是GetTickCount64
,或者其他一些不会延迟的时间测量。
答案 1 :(得分:2)
不要检查0
;其他人已经说明了检查有缺陷的原因。如果要避免环绕行为,请完全避免GetTickCount
。使用GetTickCount64
,或者如果您需要支持Vista之前的系统,请使用GetSystemTimeAsFileTime
或QueryPerformanceCounter
,它们都可以作为Windows 2000使用。
对于GetSystemTimeAsFileTime
,返回的值自1601年1月1日起以100纳秒的时间间隔进行测量,因此您可以转换为毫秒,如下所示:
DWORD64 MyGetTickCount64()
{
FILETIME ft;
GetSystemTimeAsFileTime(&ft);
DWORD64 ret = (DWORD64(ft.dwHighDateTime)<<32) | ft.dwLowDateTime;
ret = ret / 10000;// convert to milliseconds.
return ret;
}
QueryPerformanceCounter
可以像这样使用:
DWORD64 MyGetTickCount64() {
LARGE_INTEGER freq;
QueryPerformanceFrequency(&freq);
LARGE_INTEGER now;
QueryPerformanceCounter(&now);
return now.QuadPart / freq.QuadPart * 1000;
}
答案 2 :(得分:1)
没有
GetTickCount在49.7天之后回绕到0,但是一旦它开始,它就会重新开始计数。
您可能希望使用GetTickCount64(自Vista以来一直可用)。如果您需要支持旧系统(甚至可能不支持),您可能希望使用GetSystemTimeAsFileTime。这几乎是永远可用的(正式列为Windows 2000,但我认为它可能比这更老)。
后者都使用64位计数,因此翻转不是问题。