プログラミングのメモ帳(C/C++/HSP)

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

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 をリンクして下さい。

関連記事



コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ハンドル/スレッド総数の取得 | トップ | 指定した特権名の有効/無効 »
最新の画像もっと見る

コメントを投稿

システム関連」カテゴリの最新記事