2016-03-30 7 views
1

Ich versuche herauszufinden, wie lange der aktuelle Benutzer ungefähr im Leerlauf (z. B. this question) von Python auf einem Windows-Computer war.GetLastInputInfo und GetTickCount sind nicht miteinander konsistent

Dazu muss ich das Ergebnis von GetLastInputInfo mit dem Ergebnis von GetTickCount vergleichen. Die Ergebnisse sollten in Millisekunden angegeben werden.

(Ich erwarte Überroll alle 49,7 Tage Probleme, aber ich werde das später lösen.)

Mein Code ist einfach:

import win32api 

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

print(last_active, now, elapsed_milliseconds) 

Ich erwarte, dass zwei ähnliche große Zahlen zu erhalten, und ein Unterschied von einigen hundert Millisekunden.

Stattdessen erhalte ich Ergebnisse wie:

3978299058 -316668238 -4294967296 

und

3978316717 -316650501 -4294967218 

Zwischen läuft, werden sie um etwa den gleichen Betrag sowohl zu ändern, aber es ist eine große konstante Versatz zwischen ihnen, dass ich erwarte ich nicht.

Was fehlt mir?

Antwort

1

Betrachtet man die Zahlen genauer, ist dies eine Unsigned/Unsigned Mismatch.

3978299058 = 0xED2006B2

-316668238 (in Zweier-Komplement) = 0xED2006B2

3978316717 = 0xED204BAD

-316650501 (in Zweier-Komplement) = 0xED204BFB

So sind die Zeiten konsistent sind, Es ist nur, dass win32.GetTickCount die Tick-Anzahl als eine 32-Bit-Ganzzahl mit Vorzeichen interpretiert, während win32.GetLastInputInfo es als unsigned interpretiert.

(Insbesondere GetLastInputInfo verwendet PyLong_FromUnsignedLong während GetTickCount wirft die DWORD auf eine long und ruft dann Py_BuildValue. Sie könnten die Einreichung einen Fehler betrachten möchten, da die Zecke zählen sollte ein Wert ohne Vorzeichen sein.)

+0

Ich verstehe die Theorie, aber prüfe den pywin32 Code (win32apimodule.cpp: 1671) es sagt "zurück PyLong_FromUnsignedLong (lii.dwTime);" Das sieht richtig aus. – Oddthinking

+0

Ja, ich hätte mir die tatsächlichen Zahlen genauer anschauen sollen. Das Problem besteht einfach darin, dass ein Wert als unsigned und der andere als signed zurückgegeben wird. –

+0

Ich habe einen [Fehlerbericht] (https://sourceforge.net/p/pywin32/bugs/718/) eingereicht. Vielen Dank. – Oddthinking

0

ONce wieder, Beitrag zu Stack Overflow ist der schnellste Weg, um die Antwort auf mein eigenes Problem zu finden.

Es ist ein Rollover-Problem.

Die beiden Werte sind sehr ähnlich, wenn sie mod 2 sind.

GetTickCount64 wäre ein besserer Aufruf, aber es ist nicht in win32API enthalten.

+1

I glaube nicht, dass die Verwendung von GetTickCount64 helfen würde, da laut der Dokumentation GetLastInputInfo nur eine 32-Bit-Tick-Anzahl zurückgibt. –

Verwandte Themen