系统运行超过49天的GetTickCount

时间:2015-05-18 14:21:54

标签: windows winapi

根据MSDN GetTickCount API仅在系统未连续运行49.7天时返回系统已用时间。如果它的运行速度超过了它,它将返回0.

任何人都有这种事件的经验,这个API实际上在系统上返回0,运行时间超过49.7天?

我需要根据GetTickCount报告的值做出一些决定,如果我发现0,我会将其视为特殊情况并要求用户重启系统。

3 个答案:

答案 0 :(得分:4)

当滴答计数翻转时,它会返回0,但会继续计数。因此,您可以获得以下值序列:4294967295012等等。与您的怀疑相反,滴答计数不会翻到0,然后永远保留在那里。滴答计数在翻转后继续向上计数。

要求用户重启机器,因为你的程序无法计算过去2 32 似乎是一个相当弱的解决方案。你应该正确解决问题。也许是GetTickCount64,或者其他一些不会延迟的时间测量。

答案 1 :(得分:2)

不要检查0;其他人已经说明了检查有缺陷的原因。如果要避免环绕行为,请完全避免GetTickCount。使用GetTickCount64,或者如果您需要支持Vista之前的系统,请使用GetSystemTimeAsFileTimeQueryPerformanceCounter,它们都可以作为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位计数,因此翻转不是问题。