• ベストアンサー

QueryPerformanceCounter の使い方の間違いの指摘をお願いします。

Windowsの起動してからの時間を知りたいのです、QueryPerformanceCounterを使っています。 前は、timeGetTimeを使っていたのですが32ビットで47日以上はオーバーフローになってしまうので上のを使うことにしました。 QueryPerformanceCounterの使い方をいろいろ調べて見よう見まねでやってみたのですが、よく分からずtimeGetTimeのように使ったら訳の分からない値を返してきました。 明らかに、自分が間違っていることは分かるのですが、その致命的な間違いが分かりません。 MSDNより BOOL QueryPerformanceCounter( LARGE_INTEGER *lpPerformanceCount // カウンタの値 ); typedef union _LARGE_INTEGER { struct { DWORD LowPart; DWORD HighPart; }; LONGLONG QuadPart; } LARGE_INTEGER, *PLARGE_INTEGER; この時点でいまいちよく分からなかったのですが、使う部分は64ビットなので「QuadPart」だろうと思いました。 LONGLONG型・・・。 理解せずにプログラムを以下のように組みました。 私の理解では、QueryPerformanceCounterはWindowsが起動してからの時間を返してくれるものだと思っています。 #include <stdio.h> #include <windows.h> int main() { LARGE_INTEGER i64; LONGLONG count; QueryPerformanceCounter(&i64); count = i64.QuadPart; printf("LONGLONG=%lld\n" , count); return 0; } 実行結果 LONGLONG=3670653187373 続行するには何かキーを押してください . . . 実際の経過時間 1025500秒 基本がわかってないとは思うのですが、QueryPerformanceCounterが実際に返してる値とWindowsが起動してからの時間を64ビットで取得する方法を教えていただけないでしょうか? よろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
noname#208124
noname#208124
回答No.1

秒数を求めるならQueryPerformanceFrequency で取得できる1秒当たりの周波数で割ってください なおVista以降はGetTickCount64が使えます

googleoooo
質問者

お礼

回答ありがとうございます。 何とかできました。

その他の回答 (1)

回答No.2

QueryPerformanceCounterで返すのはパフォーマンスカウンタのカウント値です。 QueryPerformanceFrequencyと組み合わせないと処理時間は分かりません。 ////////////////////////////////////// LARGE_INTEGER Freq={0}, Begin={0}, End={0}; DWORD pastmsec = 0; QueryPerformanceFrequency(&Freq); QueryPerformanceCounter(&Begin); //処理時間計りたい処理 QueryPerformanceCounter(&End); pastmsec= (End- Begin) * 1000 / Freq;

googleoooo
質問者

お礼

回答ありがとうございます。 サンプルまでつけて頂いて、ありがとうございました

関連するQ&A

  • ディスクの空き容量を得たい2

    下で質問したのですが、画像が貼れなかったので もうひとつトピックを立てましたすいません %d から %llu に変更したところ 無事値は表示されましたが h1.QuadPart の値ではなく h1.LowPart の値が表示されました #include <windows.h> #include <stdio.h> void main() { ULARGE_INTEGER h1; ULARGE_INTEGER h2; ULARGE_INTEGER h3; GetDiskFreeSpaceEx( NULL, &h1, &h2, &h3 ); printf( "h1.QuadPart: %llu\n", h1.QuadPart ); LONGLONG i = h1.QuadPart; printf( "%llu\n", i ); } また、LONGLONG i に 代入して再表示しても やはり h1.QuadPart の値ではなく h1.LowPart の値が代入されていました これはいったいどういうことでしょうか?

  • 値を変数に代入してprintfで表示しようとしてもうまくいきません

    値を変数に代入して、printfで表示しようとしてもうまくいきません。 ソースのどこが悪いか教えていただけないでしょうか? 変数の値を1個ずつ表示する場合は、正常になります。 問題は、1行で表示する場合に1個目の値は出るのですが正常な表示にはなりません。 //ソース開始 #include <stdio.h> #include <windows.h> int main() { LARGE_INTEGER i64,h64; LONGLONG work,h,m,s; QueryPerformanceCounter(&i64); QueryPerformanceFrequency(&h64); //起動時間をミリ秒取得 work = i64.QuadPart*1000 / h64.QuadPart; //時間をhに入れる h = work / 1000 / 3600; //分をmに入れる m = (work / 1000 - h * 3600) / 60; //秒をsに入れる s = work / 1000 - h * 3600 - m * 60; //表示 printf("%d時間%02d分%02d秒\n",h,m,s); printf("%d時間\n",h); printf("%d分\n",m); printf("%d秒\n",s); printf("%d秒\n",work); return 0; } //ソースここまで //実行結果 289時間00分55秒 289時間 55分 54秒 1043754590秒 続行するには何かキーを押してください . . . //理想の表示結果 1行目が以下のようになってほしい 289時間55分54秒

  • timeGetTimeについて

    宜しくお願いします。 http://www.tsg.ne.jp/sept/prg/memo/timegettime.asp 上記のサイトを参照してtimeGetTimeを利用して実行時間の計測をしています。 このサイトにはmmsystem.hをインクルード,winmm.libとリンクしデータ型はDWORD型とあります。 しかし,そうしなくともwindows.hをインクルードしdouble型でtimeGettime();を読み込んでも値を読み込んでくれます。そしておそらく正確な数値のようなのですが,これでも大丈夫なのでしょうか。また,なぜこれでもできるのでしょうか。 御指南ください。使っているコンパイラはBCCでC言語で組んでいます。

  • ディスクの空き容量を得たい

    現在ディスクの空き容量を得るプログラムを書いている のですが #include <windows.h> #include <stdio.h> void main() { ULARGE_INTEGER h1; ULARGE_INTEGER h2; ULARGE_INTEGER h3; GetDiskFreeSpaceEx( NULL, &h1, &h2, &h3 ); printf( "h1.QuadPart: %d\n", h1.QuadPart ); } としたところ 画像のようにプラスの値が表示できないのです printf の引数の %d でULARGE_INTEGER の値を表示 できるのでしょうか? それともどこかが間違ってるのでしょうか?

  • WinAPI

    起動をするプログラムなのですが DWORD i; i = timeGetTime(); ShellExecuteA(hWnd, "open", hogeEXE, "引数1 引数2 ○",NULL,0); と、このようにやって 引数1 引数2 21345678(適当な値です。) とやりたいのですが 変数を渡すにはどうすればよいでしょうか?

  • USB の通信速度計測(パフォーマンスカウンタ使用)について

    こんにちは。 Windows で USB の通信速度を計測する GUI アプリを作成しています。 質問ですが、計測するにあたって USBアナライザ(LE-620HS)の結果とアプリの結果が異なっており、その理由を教えていただきたいです。 環境は、ターゲットデバイス(SH7045、M66590FP、エンドポイントバッファ512Byte)、デバイスドライバ(KMDF)、PC(WinXP SP3、Pentium D 3.19GHz、メモリ3GB)、アプリ(VC9.0 MFC)となります。 また以下に示すコードはアプリのメインスレッドではなく、データ受信を行うための、別スレッドとなります。(受信スレッド) 2048Byte のデータを Bulk IN したとき USBアナライザでは「40us」、アプリでは「400us」と 約10倍程度、差があります。 アプリの計測コードはパフォーマンスカウンタを使用しています。 LARGE_INTEGER nFreq,nBefore,nAfter; ::ZeroMemory( &nFreq, sizeof( nFreq ) ); ::ZeroMemory( &nBefore, sizeof( nBefore ) ); ::ZeroMemory( &nAfter, sizeof( nAfter ) ); QueryPerformanceFrequency( &nFreq ); QueryPerformanceCounter( &nBefore ); // 計測データを受信 // この関数は自作DLLからの呼び出しです。内部で DeviceIoControl 使用。他の複雑な処理はありません。 readData( 2048バイト受信 ); QueryPerformanceCounter( &nAfter ); DWORD dwTime = (DWORD)((nAfter.QuadPart - nBefore.QuadPart) * 1000 * 1000 / nFreq.QuadPart ); # 別スレッドでパフォーマンスカウンタを使用することが問題なのでしょうか?? 以上となります。 ご教授いただければ幸いです。

  • Sleep命令で指定した待機時間が一致しない

    プログラムを実行しているとSleep命令で指定した時間と、実際に待機する時間が食い違うケースが発生しています。例えば、 DWORD a = timeGetTime(); Sleep(16); DWORD b = timeGetTime() - a; のようなコードを作成した場合、bの値は31となり、予定の2倍近くウェイト処理を行っています。この原因はOSにあるのでしょうか、それともプログラムにあるのでしょうか。 なお、開発環境はWindows Vista Ultimate、Visutal C++ 2005 SP1です。

  • C言語の質問です

    C言語の質問です. DWORD の timeGetTime();でプログラムの実行時間を測ったら0だったのに CUT_SAFE_CALL(cutCreateTimer(&timer)); で取得すると時間が測れるってことありますか? timeGetTime();で取得した方は同じプログラムをfor文で何度か繰り返せばようやく違う値が返ってきます.これはやはりおかしいのでしょうか?

  • WTSEumerateSessionsでのデータの取得

    以下のプログラムで、&SessionInfoに戻ってきた データを表示させたいのですがうまくいきません。 教えていただきたいです。 #include<stdio.h> #include<windows.h> #include<wtsapi32.h> int main(){ char* name; //NetBIOS名の入れ物 char*型 HANDLE handle; //HANDLEの戻り値を取得する入れ物 BOOL bWts; //BOOLの戻り値を取得する入れ物 LPVOID lpMsgBuf; //WTSOpenでバファの格納するための入れ物 DWORD BytesReturned; //WTSOpenでバイト数を格納するための入れ物 WTS_INFO_CLASS WTSInfoClass; //WTSOpenで使う 接続情報を調べたい PWTS_SESSION_INFOA SessionInfo=NULL; DWORD Count=0; DWORD Reserved=0; DWORD Version=1; name=NULL; handle =WTSOpenServer(name); bWts = WTSEnumerateSessions( handle, Reserved, Version, &SessionInfo, &Count ); printf("セッション数は %d です\n",Count); WTSFreeMemory(SessionInfo); return 0; }

  • 困っています

    どうしても、--unsigned型のビット内容表示--の所が意味が分かりません。分かりやすく教えてください。宜しくお願いします。 /* 0~UINT_MAXを2進・8進・16進で表示 */ #include <stdio.h> #include <limits.h> /*--- 整数xのセットされたビット数を返す ---*/ int count_bits(unsigned x) { int count =0; while (x) { if (x & 1u) count++; x>>=1; } return (count); } /*---- unsigned型のビット数を返す ----*/ int int_bits(void) { return (count_bits(~0U)); } /*---- unsigned型のビットを内容を表示 ---*/ void print_bits(unsigned x) { int i; for (i=int_bits() -1; i>=0; i--) putchar(((x>>i) & 1U) ? '1' : '0'); } int main(void) { unsigned i; for (i=0; i<UINT_MAX; i++) { print_bits(i); printf(" %6o %5u %4X\n", i, i, i); } return(0); }

専門家に質問してみよう