クエリ パフォーマンス カウンター (Win32、C++) を使用してタイム スタンプを取得することはできますか? そうでない場合、Win32-C++ アプリケーションでタイム スタンプを取得する最も正確な方法は何ですか?
2 に答える
QueryPerformanceCounter
マシンの電源を入れてカウントアップしたときに何らかの値を含む単なるカウンターです。壁掛け時計とは全く関係ありません。
GetSystemTime
それGetSystemTimeAsFileTime
が十分であれば、〜15ミリ秒まで正確です。
Windows 8 のみをターゲットにしている場合GetSystemTimePreciseAsFileTime
は、非常に正確です。
Windows 8 より前で非常に高い解像度の時間が必要な場合は、システム時間とパフォーマンス カウンターを使用して、次のようなハイブリッド アプローチを試すことができます。
C++ 11 を使用している場合は、std::chrono::system_clock
orも参照することをお勧めしますstd::chrono::high_resolution_clock
。
ハードウェアにはどのようなクロック ソースがありますか?
正確さが必要な場合は、QueryPerformaceCounter を使用できません。これは、高速ですが正確ではない CPU クロックでカチカチ音をたてるからです。
割り込みタイマー: このタイマーは、1 kHz の頻度で割り込みを生成し、おそらく非常に正確です。
HPET: 1 MHz タイマー。これはあなたが使いたいものです。
オーディオ インターフェイス サンプル クロック: このクロックの周波数はオーディオ サンプル レートに依存しますが、割り込み周波数はオーディオ バッファ サイズに依存し、通常は数ミリ秒より長くする必要があります。
Waitable Timer を使用して、40 ミリ秒間隔でスクリーン キャプチャ プログラムを実行することに成功しました。デモについては、http: //www.youtube.com/watch?v=SLad8-IRtg4 を参照してください。オーディオ トラックは、オーディオ出力からオーディオ入力へのアナログ フィードバックによって記録され、フレーム クロックがオーディオ デバイスのサンプル クロックと同期していることを示しています。同じクロックは 1 ミリ秒で動作するはずですが、マシンが 3D のレンダリングとビデオ フレームの PNG への圧縮でビジー状態の場合は動作しません :-)
オーディオ デバイスのクロックを使用するには、ダミー バッファーに録音します。Windows 7 では、新しいオーディオ アーキテクチャを使用して、可能な限り小さいバッファー サイズを取得します。古いシステムでは、カーネル ストリーミングが必要です。オーディオを刺激する場合は、ファンクション ジェネレーターを Wave デバイスに接続して、トリガー条件に基づいてタイムスタンプを返すループを作成することもできます。このようにして、1ミリ秒未満になります。