(.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使用率も取れるようです。