PDH_STATUS PdhComputeCounterStatistics( IN HCOUNTER hCounter, IN DWORD FormatCode, IN DWORD FirstCounter, IN DWORD CounterNum, IN PPDH_RAW_COUNTER Counters, IN PPDH_STATISTICS Statistics);
Countersで指定するバッファは、キューの形であると仮定される。すなわち、n<CounterNum-1のとき、Counters[n]の「次の」要素はCounters[n+1]である。Counters[COunterNum-1]の「次の」要素はCounters[0]である。
呼び出し元アプリケーションは、定期的にCountersを更新していく。ある時点であるカウンタを更新したら、次に更新するカウンタは、前回更新したカウンタの「次の」カウンタである。FirstCounterに、最後に更新したカウンタの「次の」カウンタ(すなわち、Countersの中で最も古いカウンタ)のインデックスを設定して本関数を呼ぶと、Statisticsには意図した統計情報が返される。
引数の意味は以下の通り。
hCounter | (IN) | 統計値をどのように計算するかを決定するために必要な、カウンタのハンドル。 |
FormatCode | (IN) | 計算結果の返却方法を指定するフラグ。後述の表を参照。 |
FirstCounter | (IN) | どのカウンタから調査を始めるかを示すインデックス。 |
CounterNum | (IN) | Countersの要素の数。 |
Counters | (IN) | 統計情報を計算する元となるカウンタ値の配列。 |
Statistics | (OUT) | 得られた統計情報。 |
FormatCodeに指定可能なフラグは、二種類ある。それぞれの種類のフラグの論理和を指定することができる。まず、以下のフラグのいずれかが指定可能である。
PDH_FMT_DOUBLE | 倍精度浮動小数点で結果を返す。 |
PDH_FMT_LARGE | 64bit整数値で結果を返す。 |
PDH_FMT_LONG | 32bit整数値で結果を返す。 |
次に、以下のフラグのいずれかが指定可能である。
PDH_FMT_1000 | 計算結果を1000倍したものを返す。 |
PDH_FMT_NOSCALE | 計算結果には変更を加えない。 |
#define COUNTERS_SIZE 30 /* 過去30秒のCPU使用率の最大値、最小値、平均値を表示する */ void DispPerfStatistics() { HQUERY hQuery; HCOUNTER hCounter; PDH_RAW_COUNTER Counters[COUNTERS_SIZE]; PDH_STATISTICS Statistics; int CurrentCounter; int CurrentNum; int i; /* 新規クエリーを作成 */ PdhOpenQuery(NULL, 0, &hQuery); /* CPU使用率をクエリーに追加 */ PdhAddCounter(hQuery, "\\Processor(0#0)\\% Processor Time", 0, &hCounter); /* 初期カウンタ値を取得 */ PdhCollectQueryData(hQuery); PdhGetRawCounterValue(hCounter, NULL, &Counters[0]); CurrentCounter = 1; CurrentNum = 2; /* 一分間計測を行う */ for(i=0; i<60; i++) { /* 一秒待機 */ Sleep(1000); /* 現在のカウンタ値を取得 */ PdhCollectQueryData(hQuery); PdhGetRawCounterValue(hCounter, NULL, &Counters[CurrentCounter]); /* 次のカウンタの位置を計算 */ CurrentCounter++; if(CurrentCounter >= COUNTERS_SIZE) CurrentCounter = 0; /* 統計値の取得 */ PdhComputeCounterStatistics( hCounter, PDH_FMT_DOUBLE, (CurrentNum < COUNTERS_SIZE) ? 0 : CurrentCounter, CurrentNum, Counters, &Statistics); /* 統計値の表示 */ printf("min: %.02f%%, max:%.02f%%, avg: %.02f%%\n", Statistics.min.doubleValue, Statistics.max.doubleValue, Statistics.mean.doubleValue); if(CurrentNum < COUNTERS_SIZE) CurrentNum++; } /* 終了 */ PdhCloseQuery(hQuery); }