【问题标题】:GetLastInputInfo and GetTickCount are not consistent with each otherGetLastInputInfo 和 GetTickCount 不一致
【发布时间】:2016-03-30 14:53:13
【问题描述】:

我正在尝试通过 Windows 机器上的 Python 计算当前用户大约空闲了多长时间(例如 this question)。

为此,我认为我需要将GetLastInputInfo 的结果与 GetTickCount。结果应该以毫秒为单位。

(我预计每 49.7 天会出现翻转问题,但我会在稍后解决。)

我的代码很简单:

import win32api

last_active = win32api.GetLastInputInfo()
now = win32api.GetTickCount()
elapsed_milliseconds = (now - last_active)

print(last_active, now, elapsed_milliseconds)

我希望得到两个相似的大数,相差几百毫秒。

相反,我得到如下结果:

3978299058 -316668238 -4294967296

3978316717 -316650501 -4294967218

在两次运行之间,它们的变化量大致相同,但它们之间存在我没想到的大的恒定偏移量。

我错过了什么?

【问题讨论】:

    标签: python windows pywin32


    【解决方案1】:

    仔细观察数字,这是有符号/无符号不匹配。

    3978299058 = 0xED2006B2

    -316668238(二进制补码)= 0xED2006B2

    3978316717 = 0xED204BAD

    -316650501(二进制补码)= 0xED204BFB

    所以时间是一致的,只是 win32.GetTickCount 将滴答计数解释为带符号的 32 位整数,而 win32.GetLastInputInfo 将其解释为无符号。

    (具体来说,GetLastInputInfo 使用的是PyLong_FromUnsignedLong,而GetTickCountDWORD 强制转换为long,然后调用Py_BuildValue。您可能需要考虑提交一个错误,因为滴答计数应该是一个无符号值。)

    【讨论】:

    • 我理解这个理论,但是检查 pywin32 代码 (win32apimodule.cpp:1671) 它说“return PyLong_FromUnsignedLong(lii.dwTime);”看起来不错。
    • 是的,我应该更仔细地查看实际数字。问题很简单,一个值作为无符号返回,另一个作为有符号返回。
    • 我已经提交了bug report。谢谢。
    【解决方案2】:

    再一次,发帖到 Stack Overflow 是找到我自己问题的答案的最快方法。

    这是一个翻转问题。

    这两个值在 mod 232 时非常相似。

    GetTickCount64 会是一个更好的调用,但它不包含在 win32API 中。

    【讨论】:

    • 我不认为使用 GetTickCount64 会有所帮助,因为根据文档,GetLastInputInfo 仅返回 32 位滴答计数。
    猜你喜欢
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多