系统 运行 上的 GetTickCount 超过 49 天
GetTickCount on system running more than 49days
根据MSDN GetTickCount API returns 系统运行时间仅当系统未连续运行 49.7 天时。如果超过 运行,它将 return 0。
任何人都经历过这样的事件,即 API 实际上 return 在系统上是 0,即 运行 超过 49.7 天?
我需要根据 GetTickCount 报告的值做出一些决定,如果我发现 0,我会将其视为特殊情况并要求用户重新启动系统。
当滴答计数结束时,它会回到 0
但会继续计数。因此,您可以获得以下值序列:4294967295
、0
、1
、2
等。与您的怀疑相反,滴答计数不会滚动到 0
然后永远保持在那里。滴答计数在翻转后继续向上计数。
要求用户重新启动机器,因为您的程序无法计算过去 232 似乎是一个相当薄弱的问题解决方案。你应该妥善解决问题。也许使用 GetTickCount64
,或者实际上是其他一些不会翻转的时间测量方法。
没有
GetTickCount 在 49.7 天后返回到 0,但一旦返回,它就会再次开始计数。
您可能想改用 GetTickCount64(它从 Vista 开始可用)。如果您需要支持旧系统(即使您不需要),您可能希望改用 GetSystemTimeAsFileTime。这几乎永远可用(正式列为 Windows 2000,但我认为它可能比那更早)。
后两者都使用 64 位计数,因此翻转不是问题。
不检查 0
;其他人已经解释了为什么该支票存在缺陷。如果您想避免环绕行为,请完全避免 GetTickCount
。使用 GetTickCount64
,或者如果您需要支持 Vista 之前的系统,请使用 GetSystemTimeAsFileTime
or 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;
}
根据MSDN GetTickCount API returns 系统运行时间仅当系统未连续运行 49.7 天时。如果超过 运行,它将 return 0。
任何人都经历过这样的事件,即 API 实际上 return 在系统上是 0,即 运行 超过 49.7 天?
我需要根据 GetTickCount 报告的值做出一些决定,如果我发现 0,我会将其视为特殊情况并要求用户重新启动系统。
当滴答计数结束时,它会回到 0
但会继续计数。因此,您可以获得以下值序列:4294967295
、0
、1
、2
等。与您的怀疑相反,滴答计数不会滚动到 0
然后永远保持在那里。滴答计数在翻转后继续向上计数。
要求用户重新启动机器,因为您的程序无法计算过去 232 似乎是一个相当薄弱的问题解决方案。你应该妥善解决问题。也许使用 GetTickCount64
,或者实际上是其他一些不会翻转的时间测量方法。
没有
GetTickCount 在 49.7 天后返回到 0,但一旦返回,它就会再次开始计数。
您可能想改用 GetTickCount64(它从 Vista 开始可用)。如果您需要支持旧系统(即使您不需要),您可能希望改用 GetSystemTimeAsFileTime。这几乎永远可用(正式列为 Windows 2000,但我认为它可能比那更早)。
后两者都使用 64 位计数,因此翻转不是问题。
不检查 0
;其他人已经解释了为什么该支票存在缺陷。如果您想避免环绕行为,请完全避免 GetTickCount
。使用 GetTickCount64
,或者如果您需要支持 Vista 之前的系统,请使用 GetSystemTimeAsFileTime
or 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;
}