2016-03-30 9 views
1

Windowsマシン上でPythonから現在のユーザーがアイドル状態になっている時間(約this questionなど)をどれくらいの間、整理しようとしています。GetLastInputInfoとGetTickCountが一致していません

これを行うには、私はGetLastInputInfoの結果と GetTickCountの結果を比較する必要があると考えます。結果はミリ秒単位である必要があります。

(私はすべての49.7日のロールオーバー問題を期待していますが、私はその後で解決します。)

私のコードは単純です:私は2つの類似した大規模な番号を取得することを期待

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 

、彼らは両方ともほぼ同じ量だけ変化しているが、そのI、それらの間に大きなオフセット定数があります:

はその代わり、私のような結果を得ます期待していない。

私には何が欠けていますか?

答えて

1

数字をさらに詳しく見ると、これは符号付き/符号なしの不一致です。

3978299058 = 0xED2006B2

-316668238(2の補数で)= 0xED2006B2

3978316717 = 0xED204BAD

-316650501(2の補数で)= 0xED204BFB

だから、時間が一致しています、 win32.GetTickCountは、符号付き32ビット整数としてティックカウントを解釈していますが、win32.GetLastInputInfoは、それを符号なしとして解釈しています。

(具体的には、GetLastInputInfoGetTickCount一方PyLong_FromUnsignedLongを使用していることlongDWORDをキャストして、Py_BuildValueを呼び出します。ダニ数符号なしの値でなければなりませんので、あなたは、バグを提出を検討する必要があります。)

+0

私は理論を理解していますが、pywin32コード(win32apimodule。cpp:1671)、「return PyLong_FromUnsignedLong(lii.dwTime);」と表示されます。右に見える。 – Oddthinking

+0

うん、実際の数字をもっと綿密に調べたはずです。問題は、単純に、一方の値が符号なしとして返され、もう一方の値が符号付きとして返されることです。 –

+0

私は[バグ報告](https://sourceforge.net/p/pywin32/bugs/718/)を提出しました。ありがとう。 – Oddthinking

0

再び、Stack Overflowへの投稿は、自分自身の問題に対する答えを見つける最も簡単な方法です。

これはロールオーバーの問題です。

mod 2の場合、2つの値は非常に似ています。です。

GetTickCount64はより良い呼び出しですが、win32APIには含まれていません。

+1

私はドキュメンテーションによると、GetLastInputInfoは32ビットのティックカウントだけを返すので、GetTickCount64を使用すると助けになるとは思わない。 –

関連する問題