私はプログラムの初心者です。
Windowsの正確な時刻をミリ秒レベルで取得するために”GetLocalTime”で取得しようと考えていたのですが、マイクロソフトのmsdnに
システムが時刻を生成するのは毎秒 18 回です。したがって、Interval プロパティはミリ秒単位で設定されますが、間隔の真の精度は最大で 18 分の 1 秒です。
との記述があります。
上記であれば、約55.5ミリ秒毎にシステムの時刻を作成しているので、OSはどのようにして”GetLocalTime”で取得できるミリ秒の時間を作成しているのでしょうか。
実際に”GetLocalTime”で取得できるミリ秒での時刻の精度はどれ位なのでしょうか。
”GetLocalTime”以外にOSの正確な時刻を取得する方法はあるのでしょうか。
宜しくお願い致します。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
私の記憶が確かなら、NT、2000、XPにおいてはCPUの種類、OS(Serverか否か)によってチックカウントがインクリメントされるタイミングが違うはず(10か15msec)です。
これらのOSでは一定タイミングごとにタイマー割り込みが発生しその際にOSが保持するチックカウントをインクリメントします。
GetTickCount()はこのチックカウントに先ほどのインクリメントタイミングを乗じたものが返されます。
GetLocalTime()はこれにOS起動時の時間を足したものが返されたと記憶しています。
リアルタイムOSではないので、いずれの関数を使用しても正確な時間を完全には取得することはできません。
確かに一定間隔で時間補正は行っていますが、そのずれが10msec以内になるようには補正してくれるわけではないです。かなりアバウトだったと思います。
この意味ではNTPで標準時刻と合っているOS時刻に合わせることは可能でしょうが、
NTPで標準時刻と合っているOS時刻自体が厳密な意味では正確ではないです。
No.3
- 回答日時:
55.5msec単位に処理している以上、基本的には単純に55.5msecを加算していると思います。
これで数値的には.1msecの単位まで値はでますね。
もちろん、精度は55.5msecですが。
通常のWindowsで最も精度が高い時間計測の方法は
QueryPerformanceCounter,QueryPerformanceFrequency
を使うことです。(使えない場合がある)
但し、時刻ではありません。
OS自体、msec単位の高精度の時刻は提供していないでしょう。
また、Windowsは通常スレッドスイッチが10msec単位ですし、OSがリアルタイムOSでもありませんし、
高い精度での時間処理は非常に困難です。
初心者と自称される方には無理だろうと思います。
回答ありがとうございました。
msec単位の高精度の時刻は提供していないとのことで、時間計測等を駆使して頑張ってみたいと考えます。
No.2
- 回答日時:
完全な計時方法はありません。
通常はGetLocalTimeを使用しますが、Win95で13mSec, Win98で5mSec, NTで10mSec程度の誤差が出ます。しかし、通常の用途ではこれで十分です。これ以上の精度が必要な場合、timeGetTimeやGetTickCountを使用する必要があります。それでも完全にはなりません。ラウンドロビン優先順位以上のリアルタイム優先順位にするとかドライバを作るとかすればもう少しましになると思いますが、OSは時計ではありません。回答ありがとうございました。
ちなみに、今回作成しようとしていた内容は、自作のソフトに独自の時刻(標準時刻と一定時間ずらす目的)を持たせ、NTPで標準時刻と合っているOS時刻との時刻差を定周期に比較することで、自作ソフトの時刻の精度(10ms以内の誤差)を上げようと考えておりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(開発・運用・管理) bashで15分前と現在のエポックタイムの時間を取得したい 2 2023/02/01 19:10
- Android(アンドロイド) Androidスマホの時刻の自動同期の頻度を短くしたい 4 2022/12/02 17:29
- C言語・C++・C# win10で、正確な待ち時間の作り方 6 2023/02/14 18:28
- 物理学 特殊相対性理論と量子もつれ。 2 2023/01/18 18:41
- 物理学 なめらかな水平面の床の上に、質量 200 g の物体がある。床の面を xy 面とし、鉛直方向に z 1 2022/07/23 11:28
- 数学 『今、何時?』 2 2022/12/05 00:00
- その他(ネットショッピング・通販・ECサイト) 初期不良の対応について 5 2023/07/21 19:46
- 労働相談 タイムカードを通す機械(何という機械か分かりません)のモニターには現在時刻が何時何分何秒まで表示され 6 2022/08/28 16:56
- Excel(エクセル) エクセルの関数に関しての質問です。 5 2022/10/07 11:17
- Excel(エクセル) Excel 2019で質問があります。 計測器のデータをExcelで記録したんですが、1秒刻みで記録 4 2022/09/07 22:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.NETで DataRow()を利用して...
-
VBA:小数点以下の数字を取得で...
-
データ数をカウントしたいのですが
-
count(*)で取得した値をJAVAの...
-
VBAでActiveDirectoryのユーザ...
-
Flexgridで選択行の列の値を取...
-
ListView 項目の選択/選択解除...
-
リストビュー:先頭行のアイテ...
-
時間を分に変換するプログラム
-
ドロップダウンリストの初期表...
-
like演算子内に変数って使えな...
-
EXCELのリストボックスを選択し...
-
getParameter と getAttribut...
-
asp.netでtextboxの値を取得
-
ListViewで複数選択された項目...
-
imgctl.dllを使って読み込んだ...
-
VB6.0のレジストリ情報取得方法
-
Google Apps Script で、Web上...
-
利用者側のMACアドレスを取得し...
-
.NETで現在時刻を常に動作させ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでActiveDirectoryのユーザ...
-
VB.NETで DataRow()を利用して...
-
VBA:小数点以下の数字を取得で...
-
ListView 項目の選択/選択解除...
-
like演算子内に変数って使えな...
-
count(*)で取得した値をJAVAの...
-
利用者側のMACアドレスを取得し...
-
データ数をカウントしたいのですが
-
JavaScriptでWindowsログオンID...
-
ListViewで複数選択された項目...
-
Flexgridで選択行の列の値を取...
-
エクセルVBAで複数選択できるよ...
-
VBA リストボックス複数選択か...
-
getParameter と getAttribut...
-
Excel VBA でログインしてい...
-
VBScriptで数値にコンマを付け...
-
Spreadの選択行の取得について
-
コンボボックスの表示は最大何行?
-
コンボボックス表示文字列を取...
-
VB .netにて現在時刻+1時間後...
おすすめ情報