プロが教えるわが家の防犯対策術!

私はプログラムの初心者です。

Windowsの正確な時刻をミリ秒レベルで取得するために”GetLocalTime”で取得しようと考えていたのですが、マイクロソフトのmsdnに

システムが時刻を生成するのは毎秒 18 回です。したがって、Interval プロパティはミリ秒単位で設定されますが、間隔の真の精度は最大で 18 分の 1 秒です。

との記述があります。
上記であれば、約55.5ミリ秒毎にシステムの時刻を作成しているので、OSはどのようにして”GetLocalTime”で取得できるミリ秒の時間を作成しているのでしょうか。

実際に”GetLocalTime”で取得できるミリ秒での時刻の精度はどれ位なのでしょうか。
”GetLocalTime”以外にOSの正確な時刻を取得する方法はあるのでしょうか。

宜しくお願い致します。

A 回答 (4件)

私の記憶が確かなら、NT、2000、XPにおいてはCPUの種類、OS(Serverか否か)によってチックカウントがインクリメントされるタイミングが違うはず(10か15msec)です。


これらのOSでは一定タイミングごとにタイマー割り込みが発生しその際にOSが保持するチックカウントをインクリメントします。
GetTickCount()はこのチックカウントに先ほどのインクリメントタイミングを乗じたものが返されます。
GetLocalTime()はこれにOS起動時の時間を足したものが返されたと記憶しています。

リアルタイムOSではないので、いずれの関数を使用しても正確な時間を完全には取得することはできません。
確かに一定間隔で時間補正は行っていますが、そのずれが10msec以内になるようには補正してくれるわけではないです。かなりアバウトだったと思います。
この意味ではNTPで標準時刻と合っているOS時刻に合わせることは可能でしょうが、
NTPで標準時刻と合っているOS時刻自体が厳密な意味では正確ではないです。
    • good
    • 0

55.5msec単位に処理している以上、基本的には単純に55.5msecを加算していると思います。


これで数値的には.1msecの単位まで値はでますね。
もちろん、精度は55.5msecですが。

通常のWindowsで最も精度が高い時間計測の方法は
QueryPerformanceCounter,QueryPerformanceFrequency
を使うことです。(使えない場合がある)
但し、時刻ではありません。
OS自体、msec単位の高精度の時刻は提供していないでしょう。

また、Windowsは通常スレッドスイッチが10msec単位ですし、OSがリアルタイムOSでもありませんし、
高い精度での時間処理は非常に困難です。
初心者と自称される方には無理だろうと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
msec単位の高精度の時刻は提供していないとのことで、時間計測等を駆使して頑張ってみたいと考えます。

お礼日時:2005/06/03 11:59

完全な計時方法はありません。

通常はGetLocalTimeを使用しますが、Win95で13mSec, Win98で5mSec, NTで10mSec程度の誤差が出ます。しかし、通常の用途ではこれで十分です。これ以上の精度が必要な場合、timeGetTimeやGetTickCountを使用する必要があります。それでも完全にはなりません。ラウンドロビン優先順位以上のリアルタイム優先順位にするとかドライバを作るとかすればもう少しましになると思いますが、OSは時計ではありません。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
ちなみに、今回作成しようとしていた内容は、自作のソフトに独自の時刻(標準時刻と一定時間ずらす目的)を持たせ、NTPで標準時刻と合っているOS時刻との時刻差を定周期に比較することで、自作ソフトの時刻の精度(10ms以内の誤差)を上げようと考えておりました。

お礼日時:2005/06/01 18:57

GetLocalTimeでの返却値は、


Windows98の時代は、毎秒18回でインクリメントされるカウンタを55.5倍して、OSを立ち上げた時刻を足して返していると思います。
WindowsXPはどうなっているか分かりません。
    • good
    • 0
この回答へのお礼

早急な回答ありがとうございました。
ちなみに今回対象としているOSはWindows2000ですが、このOSの場合はどうなるのでしょうか。

お礼日時:2005/06/01 18:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!