Tickイベントの処理
実際にカウンタ値を取得する処理は、TimerコントロールのTickイベントハンドラで行います。既にTimerコントロールはIntervalプロパティを100ミリ秒に設定しているので、この時間間隔でプログレスバーの表示を更新するようにします。
オブジェクト変数の宣言
PerformanceCounterクラスはSystem.Diagnostics名前空間に属しているので、この名前空間をインポートします。
また、PerformanceCounterクラスのインスタンスへの参照を格納するオブジェクト変数を使用しますが、この変数宣言をモジュールレベルで行います。Tickイベントハンドラ内で宣言すると、毎回PerformanceCounterクラスのインスタンスを作成することになってしまい、プログラムは正常に動作しませんので注意してください。
なお、このプログラムでは、筆者のコンピュータに実装されている論理ドライブ「C」「E」「J」の3つのを対象にしています。サンプルプログラムの実行ファイルは、ドライブCのみ動作するように作成してありますが、違うドライブでも試したい場合は以降のコードのドライブ名を変更して使用してください。
Imports System.Diagnostics Public Class Form1 Private Disc1, Disc2, Disc3 As New PerformanceCounter()
using System.Diagnostics; namespace discind_cs { public partial class Form1 : Form { public Form1() { InitializeComponent(); } PerformanceCounter Disc1 = new PerformanceCounter(); PerformanceCounter Disc2 = new PerformanceCounter(); PerformanceCounter Disc3 = new PerformanceCounter();
最初の論理ドライブの情報取得
Tickイベントハンドラでは、取得したドライブ転送量を格納する変数を宣言します。これは、Visual BasicではSingleで、Visual C#ではfloat型で宣言します。というのも、パフォーマンスカウンタのデータを取得するNexVqalueメソッドの戻り値がこのデータ型だからです。
次に、PerformanceCounterクラスの3つのプロパティに、取得するカウンタのカテゴリ名、カウンタ名、インスタンス名を記述します。インスタンス名はドライブ名に「:」を付けた文字列になります。
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Dim p1, p2, p3 As Single 'Disk1 Disc1.CategoryName = "LogicalDisk" Disc1.CounterName = "Disk Transfers/sec" Disc1.InstanceName = "C:"
private void timer1_Tick(object sender, EventArgs e) { float p1,p2,p3; //Disk1 Disc1.CategoryName = "LogicalDisk"; Disc1.CounterName = "Disk Transfers/sec"; Disc1.InstanceName = "C:";
そして、PerformanceCounterクラスのNextValueメソッドを実行します。このメソッドが、カウンタサンプル値を取得し返してきます。
後は、プログレスバーの範囲を超えないような処理を組み込み、GcProgressBarコントロールのValueプロパティに値を設定します。なお、GcProgressBarコントロールのMaximumプロパティ、ValueプロパティはいずれもDecimal型なので、データ型変換を行ってください。
p1 = Disc1.NextValue() If p1 > Me.GcProgressBar1.Maximum Then p1 = Me.GcProgressBar1.Maximum End If Me.GcProgressBar1.Value = CInt(p1)
p1 = Disc1.NextValue(); if (p1 > (float)gcProgressBar1.Maximum) { p1 = (float)gcProgressBar1.Maximum; } gcProgressBar1.Value = (decimal)p1;
残りのドライブの処理
同じように、残りのドライブの処理も作成します。違うのは、「InstanceName」プロパティの値とGcProgressBarコントロールのオブジェクト名だけです。
これでできあがりです。
'Disk2 Disc2.CategoryName = "LogicalDisk" Disc2.CounterName = "Disk Transfers/sec" Disc2.InstanceName = "E:" p2 = Disc2.NextValue() If p2 > Me.GcProgressBar2.Maximum Then p2 = Me.GcProgressBar2.Maximum End If Me.GcProgressBar2.Value = CInt(p2) 'Disk3 Disc3.CategoryName = "LogicalDisk" Disc3.CounterName = "Disk Transfers/sec" Disc3.InstanceName = "J:" p3 = Disc3.NextValue() If p3 > Me.GcProgressBar3.Maximum Then p3 = Me.GcProgressBar3.Maximum End If Me.GcProgressBar3.Value = CInt(p3)
//Disk2 Disc2.CategoryName = "LogicalDisk"; Disc2.CounterName = "Disk Transfers/sec"; Disc2.InstanceName = "E:"; p2 = Disc2.NextValue(); if (p2 > (float)gcProgressBar2.Maximum) { p2 = (float)gcProgressBar2.Maximum; } gcProgressBar2.Value = (decimal)p2; //Disk3 Disc3.CategoryName = "LogicalDisk"; Disc3.CounterName = "Disk Transfers/sec"; Disc3.InstanceName = "J:"; p3 = Disc3.NextValue(); if (p3 > (float)gcProgressBar3.Maximum) { p3 = (float)gcProgressBar3.Maximum; } gcProgressBar3.Value = (decimal)p3;
まとめ
GcProgressBarコントロールは、Windows XP/Vistaで使われているプログレスバーをアプリケーションに実装できるコントロールです。アニメーションの色やデザインを自作することができ、数値表示の書式も自由に行えます。今回はディスクアクセスのメーターに使用しましたが、このような視覚的に情報を伝える使い方も可能です。
PerformanceCounterクラスは、コンピュータのパフォーマンスに関するさまざまなデータをリアルタイムに取得できます。パフォーマンスカウンタの取得方法さえ分かれば、ディスク容量の取得やCPUの稼動状況、メモリの空き容量など、パフォーマンスモニタで表示できるデータはほとんど取得できます。
ガジェットにも、CPUメータやメモリメータを表示するものがいくつもありますが、多分仕組みは同じようにパフォーマンスカウンタで情報を取得し、グラフィックスなどで視覚化しているだけだと思います。使い方によっては、ユーザーの役に立つアプリケーションを作ることができるでしょう。