アトリエ ぺっぺ

トップページ > プログラムTips > CPU使用率の取得

◆ CPU使用率の取得
CPUの使用率を取得するには、PDH系APIを使用します。
このAPIを使うには、pdh.libへの参照が必要になります。
CPU使用率を計る感覚としては、
計測はじめ!・・・ストップ!さて、今の間で、CPUの使用率はいくつ?
といった感じです。
    HQUERY            m_hQuery;
    HCOUNTER        m_hCounter;
    PDH_RAW_COUNTER m_RawValueStack;

    // 新規クエリーを作成
    PdhOpenQuery(NULL, 0, &m_hQuery);
    // 現在のCPU%を取得
    PdhAddCounter(m_hQuery, "\\Processor(_Total)\\% Processor Time", 0, &m_hCounter);
    PdhGetRawCounterValue(m_hCounter, NULL, &m_RawValueStack);
    
    // 5秒間ストップ
    Sleep(5000);

    // 計測
    PDH_RAW_COUNTER    RawValue;
    PDH_FMT_COUNTERVALUE FmtValue;
    PdhCollectQueryData(m_hQuery); 
    // 現在のカウンタの値を取得
    PdhGetRawCounterValue(m_hCounter, NULL, &RawValue);
    PdhCalculateCounterFromRawValue(
        m_hCounter,
        PDH_FMT_DOUBLE,
        &RawValue,
        &m_RawValueStack,
        &FmtValue);
    
    m_RawValueStack = RawValue;
    double dValue = FmtValue.doubleValue; // これが、使用率になります。
    
    // 終了
    PdhCloseQuery(m_hQuery);
私はこれをクラス化して使用しています。
上のコードは、実はクラスから抜き出して、処理順に並べただけのものです。
なので、変数にm_がついているのです(^^;すんません
// == ヘッダーファイル ==
class CCpuUseRate
{
public:
    CCpuUseRate(void);
    ~CCpuUseRate(void);
    double GetPercent();
protected:
    HQUERY          m_hQuery;
    HCOUNTER        m_hCounter;
    PDH_RAW_COUNTER m_RawValueStack;
};

// == 実装ファイル == 
// コンストラクタ
CCpuUseRate::CCpuUseRate(void)
{
    // 新規クエリーを作成
    PdhOpenQuery(NULL, 0, &m_hQuery);
    // 現在のCPU%を取得
    PdhAddCounter(m_hQuery, "\\Processor(_Total)\\% Processor Time", 0, &m_hCounter);
    PdhGetRawCounterValue(m_hCounter, NULL, &m_RawValueStack);
}

// デストラクタ
CCpuUseRate::~CCpuUseRate(void)
{
    // 終了
    PdhCloseQuery(m_hQuery);
}

// CPU使用率取得
// 使用率をパーセンテージで返します
double CCpuUseRate::GetPercent()
{
    PDH_RAW_COUNTER	RawValue;
    PDH_FMT_COUNTERVALUE FmtValue;
    // 計測
    PdhCollectQueryData(m_hQuery); 
    // 現在のカウンタの値を取得
    PdhGetRawCounterValue(m_hCounter, NULL, &RawValue);
    PdhCalculateCounterFromRawValue(
        m_hCounter,
        PDH_FMT_DOUBLE,
        &RawValue,
        &m_RawValueStack,
        &FmtValue);
    m_RawValueStack = RawValue;
    return FmtValue.doubleValue;
}
GetPercent()で返ってくる値は、コンストラクタが呼ばれてから、又は前回GetPercent()が呼ばれてから現在までのCPUの使用率です。

(C) 2002 atelier-peppe
ababa@atelier-peppe.sakura.ne.jp