プログラミングのメモ帳

日々のプログラミングで気づいた点や小技(Tips)などを紹介します。(Windows XP/Vista、VC2008)

CPU使用率の取得

2007年10月07日 09時17分00秒 | システム関連

CPU使用率を取得するには次の手順で行います。(戻る)

  1. パフォーマンス・データのハンドルを作成(PdhOpenQuery)
  2. ハンドル総数のカウンタパスを追加(PdhAddCounter)
  3. ハンドル総数のカウンタ値を取得(PdhCollectQueryData)
  4. パフォーマンス・データのハンドルを破棄(PdhCloseQuery)

プロトタイプ宣言

PDH_STATUS PdhOpenQuery(
    LPCTSTR                 szDataSource,       // ログファイル名
    DWORD                   dwUserData,         // 問い合わせに結び付ける値
    PDH_HQUERY*             phQuery             // 問い合わせハンドルのポインタ
);

PDH_STATUS PdhCloseQuery(
    PDH_HQUERY              hQuery              // 問い合わせハンドル
);

PDH_STATUS PdhAddCounter(
    PDH_HQUERY              hQuery,             // 問い合わせハンドル
    LPCTSTR                 szFullCounterPath,  // カウンタパス文字列
    DWORD_PTR               dwUserData,         // 問い合わせに結び付ける値
    PDH_HCOUNTER*           phCounter           // カウンタのハンドル
);

PDH_STATUS PdhCollectQueryData(
    PDH_HQUERY              hQuery              // 問い合わせハンドル
);

PDH_STATUS PdhGetFormattedCounterValue(
    PDH_HCOUNTER            hCounter,           // カウンタのハンドル
    DWORD                   dwFormat,           // 取得するデータ形式のフラグ
    LPDWORD                 lpdwType,           // カウンタ種類のポインタ
    PPDH_FMT_COUNTERVALUE   pValue              // カウンタ構造体のポインタ
);

構造体

typedef struct _PDH_FMT_COUNTERVALUE {
    DWORD           CStatus;            // カウンタのステータス
    union {
        LONG        longValue;          // LONG型のデータ
        double      doubleValue;        // DOUBLE型のデータ
        LONGLONG    largeValue;         // LONGLONG型のデータ
        LPCSTR      AnsiStringValue;    // LPCSTR型のデータ
        LPCWSTR     WideStringValue;    // LPCWSTR型のデータ
    };
} PDH_FMT_COUNTERVALUE, *PPDH_FMT_COUNTERVALUE;

サンプル

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <pdh.h>    // Pdh.Lib

// メイン関数
int main( void )
{
    PDH_HQUERY              hQuery;
    PDH_HCOUNTER            hCounter;
    PDH_FMT_COUNTERVALUE    fmtValue;
    
    if ( PdhOpenQuery(NULL,0,&hQuery) == ERROR_SUCCESS ){
        PdhAddCounter( hQuery, TEXT("\\Processor(_Total)\\% Processor Time"), 0, &hCounter );
        PdhCollectQueryData( hQuery );
        
        while ( !_kbhit() ){
            Sleep( 500 );
            system( TEXT("CLS") );
            PdhCollectQueryData( hQuery );
            // double型の表示
            PdhGetFormattedCounterValue( hCounter, PDH_FMT_DOUBLE, NULL, &fmtValue );
            printf( TEXT("doubleValue = %.15f\n"), fmtValue.doubleValue );
            // int64型の表示
            PdhGetFormattedCounterValue( hCounter, PDH_FMT_LARGE, NULL, &fmtValue );
            printf( TEXT("largeValue  = %I64u\n"), fmtValue.largeValue );
            // long型の表示
            PdhGetFormattedCounterValue( hCounter, PDH_FMT_LONG, NULL, &fmtValue );
            printf( TEXT("longValue   = %u\n"), fmtValue.longValue );
        }
        _getch();
        PdhCloseQuery( hQuery );
        return 0;
    }
    printf( TEXT("クエリーをオープンできません。\n") );
    return 255;
}

補足情報

  • ヘッダファイルとして pdh.h をインクルードして下さい。
  • インポートライブラリとして Pdh.Lib をリンクして下さい。

関連記事


『ソフトウェア』 ジャンルのランキング
コメント   この記事についてブログを書く
この記事をはてなブックマークに追加
« ハンドル/スレッド総数の取得 | トップ | 指定した特権名の有効/無効 »
最近の画像もっと見る

コメントを投稿


コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。

あわせて読む

トラックバック

この記事のトラックバック  Ping-URL
ブログ作成者から承認されるまでトラックバックは反映されません。