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の使用率です。
|