WindowsXP/2000で、現在のCPU占有率を調べるAPIや教えてください。また、特定の実行ファイル (例えば、game.exe) が走っているかチェックするAPIについても教えてください。具体的なコードがあると有難いです。タスクマネージャを見ろとかはダメですよ〜。あくまでWindowsAPIを使ってです。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/03/26 15:41:58
  • 終了:--

回答(2件)

id:tomaton20 No.1

tomaton20回答回数75ベストアンサー獲得回数02005/03/26 16:15:16

ポイント20pt

VC++での場合ですが、

PDH系APIを利用します。

コードです(URLはダミーです)。

#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, &amphCounter);


#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);

}

id:ryoko_komachi

ありがとうございます。特定アプリでなく、合計占有率が欲しいのですが……。引き続き募集中です。

2005/03/26 18:29:25
id:Kumappus No.2

くまっぷす回答回数3784ベストアンサー獲得回数1852005/03/26 18:48:06

ポイント60pt

このAPIを使えばよさそうです。困ったことに日本語のMSDNライブラリでは抜けてるんですよ>このAPIの説明。

ここにコード断片が載っています。

あとは適当なtick数だけ待ってUsage情報の差を複数回取って計算する部分を書けばいいはずです。

id:ryoko_komachi

おー、これは完璧っぽいです。ありがとうございます〜(涙)。

2005/03/26 22:39:11
  • id:cx20
    パフォーマンスモニタのCPU使用率を取得する方法

    パフォーマンスモニタのカウンタからトータルの「CPU 使用率」を取得する場合、
    「¥Processor(_Total)¥% Processor Time」を参照すれば良いようです。

    tomaton20 さんのサンプルを、

    //cpe.szObjectName = ”Process”;
    //cpe.szInstanceName = ”notepad”;
    cpe.szObjectName = ”Processor(_Total)”;
    cpe.szInstanceName = NULL;

    のように修正して取得できることを確認しました。

    <参考情報>
    ■ [00024941](SET)] CPU使用率の取得(PDH)方法について
    http://forums.belution.com/ja/vc/000/249/41s.shtml
  • id:terra5
    GetSystemTimesって

    2003,XP SP1以降とあるので、2000では使えませんね。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません