6

カスタム ハードウェアから受信する RS232 シリアルおよびネットワーク データの (かなり) 正確なタイムスタンプを必要とするプロジェクトに取り組んでいます。データは多数の独立したハードウェア ソースから取得されるため、すべてのデータにタイムスタンプを付ける必要があります。これにより、公称ポイント イン タイムにデスキュー/補間できるようになります。

私の即時のことはタイムスタンプに組み込みの Now コマンドを使用することでしたが、簡単な Google は、これが約 50 ミリ秒程度までしか正確ではないことを示しているようです。

残念ながら、読めば読むほど混乱します。GetTickCount と QueryPerformanceCounter については、現在のマルチコア プロセッサと CPU スロットリングによる複雑さを伴う多くの矛盾するアドバイスがあるようです。Windows マルチメディア タイマーの使用を推奨する投稿も見ましたが、これを行うためのコード スニペットが見つからないようです。

だから、誰でも私にアドバイスできますか:

1) 「今」がどれほど正確か。

2) シンプルで精度の高い代替手段があるかどうか。

注:たとえば、10ミリ秒以内にタイムスタンプを付けたいと思っています。タイマー自体を探しているのではなく、より良いタイムスタンプ方法を探しているだけです。これは、Windows 7 32 ビットの低電力マイクロ PC で実行されます。違いがある場合は、Delphi XE または Delphi 2007 のいずれかを使用します。

4

1 に答える 1

10

ドキュメントによると、Nowは最も近い秒までしか正確ではありません。

TDateTime値はミリ秒を表すことができますが、Nowは最も近い秒までしか正確ではありません。

それにもかかわらず、現在の実装を見ると、NowはGetLocalTimeWindowsAPIと同じくらい正確です。

簡単なテストを行うと、時計のミリ秒ごとにNowが値を返すことが表示されます。次に例を示します。

begin
  System.SysUtils.FormatSettings.LongTimeFormat := 'hh:mm:ss.zzz';
  for I := 1 to 5000 do
    Writeln(TimeToStr(Now()));
end.

このコンソールプログラムをコマンドラインから実行するproject1 >times.txtと、Windows 7 64ビットマシンで、29ミリ秒連続で実行されるファイルを取得しました(ファイルに誰も欠落していません)。

Windows環境で実行している場合、システムのビジー状態と、アプリケーション/スレッドの優先度に応じて、アプリケーション/スレッドがプロセッサスライスを取得する可能性があるという事実に直面する必要があります。システム。

于 2013-01-29T00:54:49.047 に答える