(.Net)任意のプロセスのCPU使用率を出すコード
任意のプロセスのCPU使用率を求めたいと思ってググっていたらVisualStudioフォーラム:複数のプロセス毎のCPU使用率同時取得にドンピシャな答えがありました。

コピペになりますが、ベンチマークソフト SUPER_PI のCPU使用率を求めたい時はこうなります。
mSystemProcessNameで、プロセスイメージ名(拡張子は無し)を指定します。

このPGでは指定したプロセスのCPU使用率しか求めれないため、全プロセスのCPU使用率を知りたい時は、一旦全プロセスイメージ名を取得して、それぞれ別スレッドでこのコードを動かすみたいな作りになろうかと思います。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading;
 
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
bool mStop = false;
string mSystemProcessName = "SUPER_PI";
int mMonitorInterval = 1;
 
/// <summary>パフォーマンスカウンタ・カテゴリ名(プロセス)</summary>
const string CATEGORY_NAME = "Process";
/// <summary>パフォーマンスカウンタ・カテゴリ名(プロセッサ)</summary>
const string CATEGORY_NAME_PROCESSOR = "Processor";
/// <summary>パフォーマンスカウンタ・カウンタ名(プロセッサ使用時間)</summary>
const string COUNTER_NAME_PROCESSOR_TIME = "% Processor Time";
/// <summary>ナノ秒単位での1秒の値</summary>
double NANO_SECOND_TICKS = 10000000;
/// <summary>CPUのコア数</summary>
double mCoreNumber;
 
#region 指定時間間隔内でのデータ格納領域
/// <summary>プロセッサ使用時間</summary>
double[] mDataContainer_ProcessorPercent= new double[10];
#endregion
 
#region 直前の監視タイミングでのデータ格納領域
/// <summary>プロセッサ使用時間</summary>
double mBefor_ProcesserPercent=0;
#endregion
 
PerformanceCounter mProcessTime;
 
#region CPUのコア数取得
PerformanceCounter mWorkCounter_CoreNumber;
 
mCoreNumber = 1;
if (PerformanceCounterCategory.Exists(CATEGORY_NAME_PROCESSOR))
{
if (PerformanceCounterCategory.CounterExists(COUNTER_NAME_PROCESSOR_TIME, CATEGORY_NAME_PROCESSOR))
{
for (int i = 0; i < 32; i++)
{
try
{
string wkInst = i.ToString();
mWorkCounter_CoreNumber = new PerformanceCounter(CATEGORY_NAME_PROCESSOR, COUNTER_NAME_PROCESSOR_TIME, wkInst, ".");
long buf = mWorkCounter_CoreNumber.RawValue;
mCoreNumber = double.Parse((i + 1).ToString());
}
catch
{
break;
}
}
}
}
#endregion
 
#region プロセスのパフォーマンスカウンタ定義
 
 
// プロセッサ使用時間
mProcessTime = new PerformanceCounter(
CATEGORY_NAME,
COUNTER_NAME_PROCESSOR_TIME,
mSystemProcessName,
".");
#endregion
 
// カレント時間を取得
DateTime current = DateTime.Now;
// ループ
while (true)
{
// ストップフラグが設定されたらループエンド
if (mStop) break;
// カレント時間の秒とが現在の秒と異なるか?
if (DateTime.Now.Second != current.Second)
{
// カレント時間の更新
current = DateTime.Now;
// カレント秒をログ出力間隔で割る
int div_sec = current.Second % mMonitorInterval;
// カレント秒がログ出力間隔で割り切れるか?
if (div_sec == 0)
{
//------------------------------------------------
// 監視間隔が切り替わるタイミングでログ情報出力
//------------------------------------------------
//PutLog(current); // ログファイルへデータ登録
//InitWorkArea(); // データ格納クラスの初期化
}
// CPU使用率 CPU使用時間(単位:100ナノ秒) / 1秒(10000000*100ナノ秒)/ CPUのコア数
mDataContainer_ProcessorPercent[div_sec] = (mProcessTime.RawValue - mBefor_ProcesserPercent) / NANO_SECOND_TICKS / mCoreNumber;
//CPU使用率出力
Debug.WriteLine(mDataContainer_ProcessorPercent[div_sec]);
// 直前の値として退避
mBefor_ProcesserPercent = mProcessTime.RawValue;
}
Thread.Sleep(10);
}
}
}
}


参考:
プロセス毎のCPU使用率の取得: DOBON.NETプログラミング掲示板過去ログ
CPU使用率(C#/VB.NET) [サンプルソース] [ヨーキー景吾の逃走]
C++でCPU使用率やメモリ使用量を調べる - 小さな星がほらひとつ C++の場合はこの方法でプロセスのCPU使用率も取れるようです。
[PR]
by jehoshaphat | 2014-02-12 00:53 | .Net開発 | Trackback | Comments(0)
トラックバックURL : http://jehupc.exblog.jp/tb/21630866
トラックバックする(会員専用) [ヘルプ]
※このブログはトラックバック承認制を適用しています。 ブログの持ち主が承認するまでトラックバックは表示されません。


<< VNXeのCIFS共有フォルダ... (.Net)ターミナルサーバで... >>