次の方法で共有


パフォーマンス情報を取得する方法について ~ CPU 使用率の取得 ~

download.gifサンプル コードのダウンロード (vbmigtips_PerformanceCounter.msi, 492 KB)

※ このサンプルをインストールするには Visual Studio 2005 が必要です。

メモリ、ディスク、プロセス、スレッドなどのシステムパフォーマンスに関する情報を取得したい場合があると思います。そこで今回は、システムパフォーマンスの情報を取得する方法について紹介します。

システムパフォーマンスに関する情報を取得する場合、System.Diagnostics.PerformanceCounter クラスを使用します。PerformanceCounter クラスの CategoryName プロパティ、CounterName プロパティ、InstanceName プロパティをそれぞれ指定し、NextValue メソッドでカウンタの計算値を取得します。
CategoryName プロパティには、CPU(Processor) やメモリ(Memory)、プロセス(Process)などのカテゴリ名を設定し、CounterName プロパティには、CategoryName プロパティに設定したカテゴリに対するカウント名を指定します。そして、CategoryName プロパティで設定したカテゴリがインスタンスに分割される場合、InstanceName プロパティに、インスタンス名を設定します。単一の場合は空の文字列 (「""」) を設定します。

たとえば、CPU 使用率を取得する場合、以下のように実装を行います。
今回は、BackgroundWorker クラス (BackgroundWorker コントロール) を使用して 500 ミリ秒ごとに CPU 使用率を取得します。取得した CPU 使用率は、ProgressBar に表示します (図1) 。

PerformanceCounter_fig01.jpg
図1

また今回は、Windows コントロールとしてサポートされている PerformanceCounter コントロールを使用します。

まず、PerformanceCounter コントロールと BackgroundWorker コントロールをフォームにドラッグ & ドロップし、プロパティ ウィンドウを使用して各プロパティの設定を行います。PerformanceCounter コントロールの CategoryName プロパティに「Processor」を設定し、CounterName プロパティに「% Processor Time」、InstanceName プロパティに「_Total」を設定します (図2) 。

PerformanceCounter_fig02.jpg
図2

次に、以下のコードを実装します。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
   Me.BackgroundWorker1.RunWorkerAsync()
End Sub

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
   Dim doCPUData As Double = 0
   While 1
      Double.TryParse(PerformanceCounter1.NextValue(), doCPUData)
      BackgroundWorker1.ReportProgress(doCPUData)
      System.Threading.Thread.Sleep(500)
   End While
End Sub

Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
   Me.Label5.Text = CType(e.ProgressPercentage, Integer).ToString()
   ProgressBar1.Value = CType(e.ProgressPercentage, Integer)
End Sub

リスト1

上記 (リスト1) の「Me.BackgroundWorker1.RunWorkerAsync()」でバックグラウンド操作の実行を開始します。
「System.Threading.Thread.Sleep(500)」で 500 ミリ秒間スレッドを一時中断します。「Double.TryParse(PerformanceCounter1.NextValue(), doCPUData)」では、NextValue メソッドを使用して CPU 使用率を取得し、取得した値を倍精度浮動小数点数型に変換します。そして、「BackgroundWorker1.ReportProgress(doCPUData)」で ProgressChanged イベントを発生させます。これにより、ProgressChanged イベント ハンドラの「Me.Label5.Text = CType(e.ProgressPercentage, Integer).ToString()」で取得した CPU 使用率をラベルに記述し、「ProgressBar1.Value = CType(e.ProgressPercentage, Integer)」で、プログレス バーの現在位置を指定します。
(BackgroundWorker の詳しい処理については、「別スレッドからコントロールを操作する方法について」を参照してください。)

これらの実装を行い、アプリケーションを起動すると、図1 のように、500 ミリ秒ごとに CPU 使用率が取得され、プログレス バーによって使用率が表示されます。

このように、PerformanceCounter クラスを使用することで CPU 使用率などのパフォーマンス情報を取得することができます。今回は、カテゴリ、インスタンス、カウントの設定を実装時に行いましたが、任意で設定することもできます。任意で設定するため、PerformanceCounterCategory メンバを使用して、カテゴリ、カウンタ、インスタンスを列挙することができます。カテゴリを列挙する場合は GetCategories メソッドを、カテゴリのカウンタを列挙する場合は GetCounters メソッドを、カウンタのインスタンスを列挙する場合は GetInstanceNames メソッドをそれぞれ使用します。