[解決済み] QueryPerformanceCounterの使い方を教えてください。
質問
最近、タイマクラスでミリ秒からマイクロ秒に変更する必要があると判断し、いくつかの研究の後、QueryPerformanceCounterがおそらく私の最も安全な賭けであると判断しました。(警告は
Boost::Posix
にある、Win32 APIで動作しないかもしれないという警告は、私を少し遠ざけた)。しかし、私はそれを実装する方法がよくわかりません。
私がやっていることは、どんな
GetTicks()
的な関数を呼び出して、それを Timer の
startingTicks
変数に代入しています。そして、経過時間を求めるには、関数の戻り値を
startingTicks
そしてタイマーをリセットするときは、関数をもう一度呼び出して startTicks を代入するだけです。残念ながら、私が見たコードでは、単に
QueryPerformanceCounter()
を呼び出すほど単純ではなく、引数として何を渡せばいいのかわかりません。
どのように解決するのですか?
#include <windows.h>
double PCFreq = 0.0;
__int64 CounterStart = 0;
void StartCounter()
{
LARGE_INTEGER li;
if(!QueryPerformanceFrequency(&li))
cout << "QueryPerformanceFrequency failed!\n";
PCFreq = double(li.QuadPart)/1000.0;
QueryPerformanceCounter(&li);
CounterStart = li.QuadPart;
}
double GetCounter()
{
LARGE_INTEGER li;
QueryPerformanceCounter(&li);
return double(li.QuadPart-CounterStart)/PCFreq;
}
int main()
{
StartCounter();
Sleep(1000);
cout << GetCounter() <<"\n";
return 0;
}
このプログラムは1000に近い数値を出力するはずです(Windowsのスリープはそれほど正確ではありませんが、999のような数値になるはずです)。
このプログラムは
StartCounter()
関数は、パフォーマンス・カウンタの刻み数を
CounterStart
変数に記録します。このとき
GetCounter()
から何ミリ秒経ったかを返します。
StartCounter()
が最後に呼び出されてからの経過時間を double で返します。
GetCounter()
が 0.001 を返すなら、それは
StartCounter()
が呼び出されてから約1マイクロ秒経過したことになる。
もし、タイマーを秒単位で表示させたい場合は
PCFreq = double(li.QuadPart)/1000.0;
から
PCFreq = double(li.QuadPart);
または、マイクロ秒が必要な場合は
PCFreq = double(li.QuadPart)/1000000.0;
しかし、実際にはdoubleを返すので、利便性のためです。
関連
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] Windowsにpipをインストールするにはどうしたらいいですか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み] C++でPOSIXを使ってコマンドを実行し、その出力を得るにはどうしたらよいですか?
-
[解決済み】WindowsでTCPまたはUDPポートをリッスンしているプロセスを見つけるにはどうすればよいですか?
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】C++の余分な資格エラー
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む