我试图在Windows API中使用GetTickCount()来获得系统正常运行时间。 我想知道系统运行了多久。
但是GetTickCount的返回值非常高。 这段代码给了我超过500小时的正常运行时间。
这也适用于GetTickCount64()。
为什么这个价值如此之高?
DWORD time_ms = GetTickCount(); DWORD seconds = (time_ms / 1000) % 60; DWORD minutes = time_ms /(1000*60) % 60; DWORD hours = time_ms / (1000*60*60); stringstream ss; ss << "Hours: "; ss << hours; ss << " Minutes: "; ss << minutes; ss << " seconds: "; ss << seconds; MessageBoxA(0, ss.str().c_str(), "Uptime", 0);
当我运行该程序,我可以看到它正在进展正确,但不能理解我将如何得到我的桌面的总正常运行时间。
谢谢
编辑 :我检查了CMD的“systeminfo”的正常运行时间,发现“系统启动时间”实际上是约500小时前。 因此,我closures了电脑,拔掉了电源,但启动但系统启动时间有这么高的价值。 但是,重新启动计算机使其重置,现在我的代码工作。
编辑2:这个博客https://blogs.msdn.microsoft.com/oldnewthing/20141113-00/?p=43623指出GetTickCount应该用于测量时间间隔比我试图实现。 好像我必须看registry。
编辑3:
在registry中find正确的计数器后,它具有与GetTickCount和类似函数相同的值。 看来,在Windows中closures带来了一些冬眠。 我还没有find任何解决办法。
GetTickCount
的文档描述了系统正常GetTickCount
的正确方法:
要获取计算机启动以来的时间,请在注册表项HKEY_PERFORMANCE_DATA中的性能数据中检索系统启动时间计数器。 返回的值是一个8字节的值。 有关更多信息,请参阅性能计数器
我试图在Windows API中使用GetTickCount()来获得系统正常运行时间。 我想知道系统运行了多久。
除了别人所说的之外,还有另一种解决办法。
您可以从ntdll.dll
调用NtQuerySystemInformation()
,将其SystemInformationClass
参数设置为SystemTimeOfDayInformation
以检索包含BootTime
和CurrentTime
字段的SYSTEM_TIMEOFDAY_INFORMATION
结构为LARGE_INTEGER
值:
typedef struct _SYSTEM_TIMEOFDAY_INFORMATION { LARGE_INTEGER BootTime; LARGE_INTEGER CurrentTime; LARGE_INTEGER TimeZoneBias; ULONG TimeZoneId; ULONG Reserved; ULONGLONG BootTimeBias; ULONGLONG SleepTimeBias; } SYSTEM_TIMEOFDAY_INFORMATION, *PSYSTEM_TIMEOFDAY_INFORMATION;
您可以简单地从CurrentTime
减去BootTime
来获取Windows已经运行的时间(这正是Task Manager计算“System Up Time”的时间)。
如何获得Windows启动时间?
Task Manager如何计算Up Time,为什么不同意GetTickCount?
我只是有同样的问题。 我解决了它:
我想很多旧的程序将再次错误与W10和快速启动选项…
500小时的正常运行时间并不令人意外。 大约20天。 现代系统很少关机。 通常他们被暂停而不是关闭。 我认为你的系统已经达到了500小时。
当然,你应该使用GetTickCount64
来处理64位滴答计数。 这将避免49天环绕,这是由GetTickCount
返回的32位值的结果。