我试图在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);
当我运行该程序时,我可以看到它正在正常进行,但无法理解我将如何获得桌面的总运行时间。
由于
修改: 我用&#34; systeminfo&#34;检查了正常运行时间。在CMD中发现&#34;系统启动时间&#34;实际上是aprox~500小时前。所以我关闭计算机并拔掉电源,启动但仍然,系统启动时间具有这么高的值。但是,重新启动计算机使其重置,现在我的代码工作。
编辑2: 此博客https://blogs.msdn.microsoft.com/oldnewthing/20141113-00/?p=43623指出GetTickCount应该用于测量时间间隔,而不是我想要实现的时间间隔。好像我必须看一下注册表。
编辑3:
在注册表中找到正确的计数器后,它具有相同的值具有GetTickCount和类似的功能。似乎在Windows中关闭会使其处于某种程度的休眠状态。我没有找到任何解决方案。
答案 0 :(得分:5)
GetTickCount
的文档描述了使系统正常运行的正确方法:
要获取自计算机启动以来经过的时间,请检索 注册表项中的性能数据中的System Up Time计数器 HKEY_PERFORMANCE_DATA。返回的值是一个8字节的值。更多 信息,请参阅Performance Counters
答案 1 :(得分:2)
我遇到了同样的问题。我解决了它:
我想很多旧程序会再次使用W10和快速启动选项...
答案 2 :(得分:1)
我试图在Windows API中使用GetTickCount()来获得系统正常运行时间。我想知道系统运行了多长时间。
除了其他人所说的,还有另一种替代方案。
您可以从ntdll.dll
致电NtQuerySystemInformation()
,将其SystemInformationClass
参数设置为SystemTimeOfDayInformation
,以检索包含SYSTEM_TIMEOFDAY_INFORMATION
和{{BootTime
的{{1}}结构1}}字段为CurrentTime
值:
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;
中简单地减去BootTime
以获取Windows运行所用的时间(这正是任务管理器计算“系统运行时间”的方式)。
How does Task Manager compute Up Time, and why doesn’t it agree with GetTickCount?
答案 3 :(得分:0)
500小时的正常运行时间并不特别令人惊讶。那是20天左右。现代系统很少关闭。通常它们是暂停而不是关闭。我认为你的系统真的已经运行了500个小时。
当然,您应该使用GetTickCount64
来处理64位滴答计数。这将避免49天的回绕,这是GetTickCount
返回的32位值的结果。