PdhCalculateCounterFromRawValue 二つのパフォーマンスカウンタ値から現在のカウンタ値を取得

Cの宣言:

PDH_STATUS PdhCalculateCounterFromRawValue(
	IN HCOUNTER hCounter,
	IN DWORD FormatCode,
	IN PPDH_RAW_COUNTER FirstCounter,
	IN PPDH_RAW_COUNTER SecondCounter,
	IN PPDH_FMT_COUNTERVALUE CalcValue);

説明:

FirstCounterとSecondCounterの二つのカウンタ値から、現在のカウンタ値を計算し、結果をCalcValueに返す。

引数の意味は以下の通り。
hCounter (IN) 現在のカウンタ値をどのように計算するかを決定するために必要な、カウンタのハンドル。
FormatCode (IN) 計算結果の返却方法を指定するフラグ。後述の表を参照。
FirstCounter (IN) 計算元の一つ目のカウンタ値。
SecondCounter (IN) 計算元の二つ目の(古いほうの)カウンタ値。
CalcValue (OUT) 計算結果のカウンタ値。

FormatCodeに指定可能なフラグは、二種類ある。それぞれの種類のフラグの論理和を指定することができる。まず、以下のフラグのいずれかが指定可能である。
PDH_FMT_DOUBLE 倍精度浮動小数点で結果を返す。
PDH_FMT_LARGE 64bit整数値で結果を返す。
PDH_FMT_LONG 32bit整数値で結果を返す。

次に、以下のフラグのいずれかが指定可能である。
PDH_FMT_1000 計算結果を1000倍したものを返す。
PDH_FMT_NOSCALE 計算結果には変更を加えない。

Cのサンプル:

既にローカルマシン上で起動されているメモ帳のCPU使用率を1秒ごとに10秒間計測し、計測結果のパフォーマンスカウンタ値を退避しておく。計測が終了したら、退避していたパフォーマンスカウンタ値を元に、1ごとのCPU使用率を求め、結果を表示する。
/* 一秒ごとのCPU使用率を退避し、後でまとめて表示するる */
void DispTimePerSec()
{
	HQUERY hQuery;
	HCOUNTER hCounter;

	PDH_FMT_COUNTERVALUE FmtValue;
	PDH_RAW_COUNTER RawValues[10];

	int i;

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

	/* 既に起動しているメモ帳のCPU使用率のカウンタをクエリーに追加 */
	PdhAddCounter(hQuery, "\\Process(notepad#0)\\% Processor Time", 0, &hCounter);

	PdhGetRawCounterValue(hCounter, NULL, &RawValues[i]);

	/* 計測 */
	printf("計測開始...\n");
	for(i=0; i<10; i++) {
		 /* 一秒間待って最新の情報に更新 */
		Sleep(1000);
		PdhCollectQueryData(hQuery); 

		/* 現在の生のカウンタの値を取得 */
		PdhGetRawCounterValue(hCounter, NULL, &RawValues[i]);
	}

	printf("計測終了.\n");

	/* 今の十秒間での、一秒ごとのメモ帳のCPUの使用率を表示 */
	printf("メモ帳の使用率...\n");
	for(i=0; i<9; i++) {
		/* CPU使用率を計算 */
		PdhCalculateCounterFromRawValue(
			hCounter,
			PDH_FMT_DOUBLE,
			&RawValues[i+1],
			&RawValues[i],
			&FmtValue);

		/* CPU使用率を表示 */
		printf("\t%d秒目〜%d秒目: %f%%\n", i+1, i+2, FmtValue.doubleValue);
	}

	/* 終了 */
	PdhCloseQuery(hQuery);
}


(original text:1999/01/05 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。