Windows 10上的GetTickCount值

时间:2016-02-10 14:57:47

标签: c++ windows winapi windows-10

我试图在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中关闭会使其处于某种程度的休眠状态。我没有找到任何解决方案。

4 个答案:

答案 0 :(得分:5)

GetTickCount的文档描述了使系统正常运行的正确方法:

  

要获取自计算机启动以来经过的时间,请检索   注册表项中的性能数据中的System Up Time计数器   HKEY_PERFORMANCE_DATA。返回的值是一个8字节的值。更多   信息,请参阅Performance Counters

答案 1 :(得分:2)

我遇到了同样的问题。我解决了它:

  • 使用restart命令而不是关闭计算机:这会执行计算机的真正重启,而不是半休眠&#34;喜欢快速启动时的关机命令&#34;已启用
  • 禁用&#34;快速启动&#34;选项。这个快速启动选项会在启动时导致未重置的GetTickCount !!

我想很多旧程序会再次使用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 to get Windows boot time?

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位值的结果。