Skip to content
2009/01/12 / highmt

WindowsのGetTickCount()は休止中もインクリメントするのか?

そもそもの発端は、クライアントサーバーアプリケーションで、クライアントとサーバーの時刻を同期するしくみ。
このしくみでは、クライアントプログラムで時刻を取得しようとしたとき、サーバーの時刻を返す。
このとき、毎回サーバーに問い合わせするのは無駄なので、1回問い合わせたらしばらくはサーバーには問い合わせない。
このために、サーバーから時刻を取得したあと、
サーバーの時刻とそのときのクライアントの時刻を保存し、
次に時刻を取得しようとしたときは、保存されたクライアントの時刻と現在のクライアントの時刻の差を、
保存されたサーバーの時刻に加えてサーバーの時刻を推測する。

保存するクライアントの時刻として普通に時刻を使ってしまうと、
クライアントの時刻が変更されたときに困る。
そこでシステムタイマーを使っているのだけれども、
サスペンドとか休止状態になったときとかにこれが止まってしまうと困る。

で、GetTickCount()の資料をあさっているのだけれどもこの記述が問題。
OSが動いているときしかインクリメントされないよ、と書いてあったりするのだが、
実験では問題なさそうだったり。
http://www.ddj.com/windows/184416651ではインクリメントされると書いてるし。
Windows95ではインクリメントされないけどWindows98では大丈夫という情報があったり。
Computerが起動してからの時間はGetTickCount()ではなくパフォーマンスカウンタを使えと書いてあったり。

.NETでは、My.Computer.Clock.TickCount(VBだけ)とEnvironment.TickCountもGetTickCountがあるのだけれど、
My.Computer.Clock.TickCountのほうは、「サスペンド中の時間はインクリメントされない」と記述があるのだが、
実験するとインクリメントされるし。
Environment.TickCountと同じ動作だと書いてあるけどEnvironment.TickCountにはそんな記述はないし。
実験するとEnvironment.TickCountもインクリメントされるし。

よくわからないのだけれども、今のところの結論は、

  • Windows XPだったらサスペンド中も休止中もインクリメントされる。きっと。
  • Windows CEはサスペンド中も休止中もインクリメントされない。きっと。
広告
%d人のブロガーが「いいね」をつけました。