Windows 10 上的 GetTickCount 值

问题描述 投票:0回答:4

我尝试使用 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 小时前。所以我关闭计算机并拔掉电源,启动,但系统启动时间仍然有这么高的值。但是,重新启动计算机使其重置,现在我的代码可以工作了。

编辑2: 此博客 https://blogs.msdn.microsoft.com/oldnewthing/20141113-00/?p=43623 指出 GetTickCount 应该用于测量时间间隔,而不是我想要实现的目标。看来我得看看注册表了。

编辑3:

在注册表中找到正确的计数器后,它具有与 GetTickCount 和类似函数相同的值。 Windows 中的关闭似乎会使其进入某种休眠状态。我还没有找到任何解决方案。

c++ windows winapi windows-10
4个回答
5
投票

GetTickCount
的文档描述了获得系统正常运行时间的正确方法:

要获取计算机启动以来经过的时间,请检索 注册表项中性能数据中的系统正常运行时间计数器 HKEY_PERFORMANCE_DATA。返回的值是一个 8 字节值。了解更多 信息,请参阅性能计数器


3
投票

我也遇到了同样的问题。我解决了这个问题:

  • 使用重新启动命令而不是关闭计算机:这会执行真正的计算机重新启动,而不是像启用“快速启动”时的关闭命令那样的“半休眠”
  • 禁用“快速启动”选项。这种快速启动选项会导致启动时 GetTickCount 不重置!!

我猜很多旧程序会在 W10 和快速启动选项后再次出现 bug...


1
投票

500 小时的正常运行时间并不特别令人惊讶。也就是20天左右。现代系统很少关闭。通常它们是暂停而不是关闭。我想你的系统确实已经运行了 500 小时。

当然,您应该使用

GetTickCount64
来处理 64 位滴答计数。这将避免由于
GetTickCount
返回 32 位值而导致的 49 天环绕。


1
投票

我尝试使用 Windows API 中的 GetTickCount() 来获取系统正常运行时间。我想知道系统运行了多长时间。

除了其他人所说的之外,还有另一种替代解决方案。

您可以从 NtQuerySystemInformation()

 调用 
ntdll.dll
,将其 
SystemInformationClass
参数设置为
SystemTimeOfDayInformation
,以检索包含
SYSTEM_TIMEOFDAY_INFORMATION
BootTime
字段作为
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
中减去
CurrentTime
即可获得 Windows 已运行的时间(这正是任务管理器计算“系统运行时间”的方式)。

如何获取Windows启动时间?

任务管理器如何计算正常运行时间,为什么它与 GetTickCount 不一致?

© www.soinside.com 2019 - 2024. All rights reserved.