DOBON.NET DOBON.NETプログラミング掲示板過去ログ

プロセス毎のCPU使用率の取得

環境/言語:[WindowsXP Professional , .NET Frmaework 2.0]
分類:[.NET]

実行されているすべてのプロセスを取得する
http://dobon.net/vb/dotnet/process/getprocesses.html

このサンプルでCPU使用率も表示させたいのですが、どうしたら良いのでしょうか。
p.TotalProcessorTimeから取得出来そうな気がするのですが、、、プロパティにありません。

よろしくお願いします。
System.Diagnostics.Process
 http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpref/html/frlrfsystemdiagnosticsprocessmemberstopic.asp
ではなく、System.Diagnostics.PerformanceCounter を使ってみてはいかがでしょうか?

VBの記事で申し訳ないですが、Microsoftにサンプルがありました。

パフォーマンス情報を取得する方法について 〜 CPU 使用率の取得 〜
http://www.microsoft.com/japan/msdn/vbasic/migration/tips/PerformanceCounter/
回答ありがとうございます。

プロセス毎のCPU使用率が取得したいのですが、Microsoftのその記事には載っていないようです、、、
プロセス毎にCPU使用率を取得することは出来ないのでしょうか。
なるほど。読み違えてました。
「プロセス毎」ということですね。

その場合も、PerformanceCounterを用いる場合を考えてみました。

まず、PerformanceCounterのインスタンスpcを作ります。
作成したpcのプロパティを以下のように設定します。

CategoryName →"Process" ("Processor"ではない)
CounterName →"% Processor Time"
InstanceName →"[起動中の計測したいプロセス名(notepad等)]"

以上の様なプロパティを設定したpcについて、
 pc.NextValue() とすることで得られました。


InstanceNameの取得は、例えば「実行されているすべてのプロセスを取得する」
 http://dobon.net/vb/dotnet/process/getprocesses.html
のように行います。
ありがとうございます。しかし、なぜか動きません。
このような感じでよろしいのでしょうか。

Dim pc As New System.Diagnostics.PerformanceCounter()
pc.CategoryName = "Process"
pc.CounterName = "% Processor Time"
For Each p As System.Diagnostics.Process In System.Diagnostics.Process.GetProcesses()
pc.InstanceName = p.ProcessName
pc.NextValue()
Console.WriteLine(p.ProcessName + " : " + pc.NextValue.ToString + " %")
Next
Console.ReadLine()
■No18466に返信(takuさんの記事)
> ありがとうございます。しかし、なぜか動きません。
> このような感じでよろしいのでしょうか。

動きますが、毎回0のようですね。
これは、NextValue()が「現在の値と以前の値の差を計測間隔時間で割ったもの」を返すためです。

[smdn:PerformanceCounterでCPU使用率をゲッツ!]
http://santamartadotnet.hp.infoseek.co.jp/documents/vbdotnet/performancecounter.html

>pc.NextValue()
>Console.WriteLine(p.ProcessName + " : " + pc.NextValue.ToString + " %")

ちょうど、このようにNextValue()を2度よんでらっしゃるので、この間に
System.Threading.Thread.Sleep(1000)を挟むと0以外の値が返ってきます。


ただこれを挟むだけだと、プロセスの個数*1000ms時間がかかるので他の方法がほしいですね。
例えば、pcをプロセスの個数分作っておくとか・・・
スマートな方法ではないですが。
無事取得することが出来ました。ありがとうございます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板