Syndication
Search


クリエイティブ・コモンズ・ライセンス
Movable Type 2.661

パフォーマンスの取得

システムモニタや、タスクマネージャの「プロセス」タブ等で、表示される「CPU使用率」とか「メモリ使用量」とかを所得する方法のメモ。
PDH系APIを使用します。ただし、これはNT系のみでの動作。たしか95系はレジストリに値が記録されていたと記憶…。たしか、昔MSDNLibraryかなにかでPDHの記事があったような記憶あるけど、忘れてしまったのでサンプル作って動作確認。で、何に使うかは不明(^_^;

#include    <windows.h>
#include    <stdio.h>
#include    <pdh.h>

void main()
{
HQUERY hQuery;
HCOUNTER hCounter;
PDH_COUNTER_PATH_ELEMENTS cpe;
char path[256];
DWORD size = 256;
PDH_FMT_COUNTERVALUE FmtValue;

//クエリー作成
PdhOpenQuery(NULL, 0, &hQuery);

//所得したい情報(カウンタ)のパスを作成
//例として、メモ帳のCPU使用率
//ObjectNameやCounterNameで指定する名称は、
//PdhEnumObjects()でオブジェクトの列挙
//PdhEnumObjectItems()でカウンタの列挙が出来る
//決めうちなら、システムモニタの「カウンタの追加」を参照
cpe.szMachineName = NULL;
cpe.szObjectName = "Process";
cpe.szInstanceName = "notepad";
cpe.szParentInstance = NULL;
cpe.dwInstanceIndex = 0;
cpe.szCounterName = "% Processor Time";
PdhMakeCounterPath(&cpe, path, &size, 0);

//カウンタをクエリーに追加
PdhAddCounter(hQuery, path, 0, &hCounter);

#if 1
//値取得
PdhCollectQueryData(hQuery);
//10秒間待つ
Sleep(10000);
//値取得
PdhCollectQueryData(hQuery);
#else
//こちらでもよいが、NT4では動かない
PdhCollectQueryDataEx(hQuery, 10, NULL);
#endif

//10秒間のメモ帳のCPUの使用率を取得
PdhGetFormattedCounterValue(hCounter, PDH_FMT_DOUBLE, NULL, &FmtValue);
printf("メモ帳のCPU使用率: %f%%\n", FmtValue.doubleValue);

//終了
PdhCloseQuery(hQuery);
}


追記:.NETでのパフォーマンスカウンタ fromMSDN
こちらはちゃんと日本訳されてます。Longhornを見据えて、そろそろクライアントアプリも.NETで開発してよいのかも。ただ現状では、.NET Frameworkが別配布&重いのが難点だけど…。