ここでは、独自のパフォーマンスカウンタを作成し、値を書き込む方法を説明します。ここで紹介する方法は、Windows 2000以降のNT系OSでのみ使用でき、またリモートコンピュータでのパフォーマンスカウンタの作成はできません。
カウンタを作成するには、カテゴリも一緒に作成しなければなりません。これは、PerformanceCounterCategory.Createメソッドにより可能です。
新しく作成したパフォーマンスカウンタに値を書き込むには、PerformanceCounterクラスの、Incrementメソッド、Decrementメソッド、IncrementByメソッド、RawValueプロパティのいずれかを使用します。IncrementメソッドとDecrementメソッドはそれぞれカウンタの生の値を1つだけ増減させます。IncrementByメソッドは指定した値だけ生の値を増加させることができます(ただし、Incrementメソッド、Decrementメソッドの方が高速です)。生の値に任意の整数を設定するには、RawValueプロパティを使います。
なおWindows Vista以降でUACが有効になっている時は、管理者に昇格しないと失敗するかもしれません。この対処法については、「Vista以降でUACが有効だとファイルの作成等に失敗する問題の対処法」をご覧ください。
以下に、カウンタ名"TestCounter"(カウンタタイプNumberOfItems32)のカウンタが含まれる、カテゴリ名"TestCategory"のパフォーマンスカウンタカテゴリを作成する例を示します。なおここでは作成したカテゴリを最後にPerformanceCounterCategory.Deleteメソッドにより削除しています。
'カテゴリ名 Dim categoryName As String = "Test Category" 'カウンタ名 Dim counterName As String = "TestCounter" 'カテゴリが登録されていない時は登録する If Not System.Diagnostics.PerformanceCounterCategory.Exists(categoryName) Then 'カテゴリを登録する System.Diagnostics.PerformanceCounterCategory.Create( _ categoryName, _ "カテゴリの説明を書きます。", _ counterName, _ "カウンタの説明を書きます。") '.NET Framework 2.0以降では次のようにPerformanceCounterCategoryを指定する 'System.Diagnostics.PerformanceCounterCategory.Create( _ ' categoryName, _ ' "カテゴリの説明を書きます。", _ ' System.Diagnostics.PerformanceCounterCategoryType.SingleInstance, _ ' counterName, _ ' "カウンタの説明を書きます。") End If 'カウンタが登録されているか調べる If Not System.Diagnostics.PerformanceCounterCategory.CounterExists( _ counterName, categoryName) Then Console.WriteLine("カウンタが登録されていません。") Return End If 'PerformanceCounterオブジェクトを作成 'ReadOnlyをFalseにする Dim pc As New System.Diagnostics.PerformanceCounter( _ categoryName, counterName, False) Dim i As Integer For i = 0 To 49 'カウンタの値を変更する pc.RawValue = i '1秒待機する System.Threading.Thread.Sleep(1000) Next i 'カテゴリを削除する System.Diagnostics.PerformanceCounterCategory.Delete(categoryName)
//カテゴリ名 string categoryName = "Test Category"; //カウンタ名 string counterName = "TestCounter"; //カテゴリが登録されていない時は登録する if (!System.Diagnostics.PerformanceCounterCategory.Exists(categoryName)) { //カテゴリを登録する System.Diagnostics.PerformanceCounterCategory.Create( categoryName, "カテゴリの説明を書きます。", counterName, "カウンタの説明を書きます。"); //.NET Framework 2.0以降では次のようにPerformanceCounterCategoryを指定する //System.Diagnostics.PerformanceCounterCategory.Create( // categoryName, // "カテゴリの説明を書きます。", // System.Diagnostics.PerformanceCounterCategoryType.SingleInstance, // counterName, // "カウンタの説明を書きます。"); } //カウンタが登録されているか調べる if (!System.Diagnostics.PerformanceCounterCategory.CounterExists( counterName, categoryName)) { Console.WriteLine("カウンタが登録されていません。"); return; } //PerformanceCounterオブジェクトを作成 //ReadOnlyをFalseにする System.Diagnostics.PerformanceCounter pc = new System.Diagnostics.PerformanceCounter( categoryName, counterName, false); for (int i = 0; i < 50; i++) { //カウンタの値を変更する pc.RawValue = i; //1秒待機する System.Threading.Thread.Sleep(1000); } //カテゴリを削除する System.Diagnostics.PerformanceCounterCategory.Delete(categoryName);
上記の例では、一つのカウンタのみを含むカテゴリを作成しました。次の例では、複数のカウンタ(といっても2つですが)を含むカテゴリを作成しています。
'CounterCreationDataCollectionオブジェクトの作成 Dim ccdc As New System.Diagnostics.CounterCreationDataCollection() 'CounterCreationDataオブジェクトの作成 Dim ccd1 As New System.Diagnostics.CounterCreationData() ccd1.CounterName = "TestCounter1" ccd1.CounterHelp = "ここにTestCounter1の説明を書きます。" ccd1.CounterType = System.Diagnostics.PerformanceCounterType.NumberOfItems32 'CounterCreationDataCollectionに追加 ccdc.Add(ccd1) 'もう一つ作成して追加 Dim ccd2 As New System.Diagnostics.CounterCreationData() ccd2.CounterName = "TestCounter2" ccd2.CounterHelp = "ここにTestCounter2の説明を書きます。" ccd2.CounterType = _ System.Diagnostics.PerformanceCounterType.RateOfCountsPerSecond32 ccdc.Add(ccd2) 'カテゴリを登録する System.Diagnostics.PerformanceCounterCategory.Create( _ "Test Category", _ "ここにTest Categoryの説明を書く。", _ ccdc) '.NET Framework 2.0以降では次のようにPerformanceCounterCategoryTypeを指定する 'System.Diagnostics.PerformanceCounterCategory.Create( _ ' "Test Category", _ ' "ここにTest Categoryの説明を書く。", _ ' System.Diagnostics.PerformanceCounterCategoryType.MultiInstance, _ ' ccdc)
//CounterCreationDataCollectionオブジェクトの作成 System.Diagnostics.CounterCreationDataCollection ccdc = new System.Diagnostics.CounterCreationDataCollection(); //CounterCreationDataオブジェクトの作成 System.Diagnostics.CounterCreationData ccd1 = new System.Diagnostics.CounterCreationData(); ccd1.CounterName = "TestCounter1"; ccd1.CounterHelp = "ここにTestCounter1の説明を書きます。"; ccd1.CounterType = System.Diagnostics.PerformanceCounterType.NumberOfItems32; //CounterCreationDataCollectionに追加 ccdc.Add(ccd1); //もう一つ作成して追加 System.Diagnostics.CounterCreationData ccd2 = new System.Diagnostics.CounterCreationData(); ccd2.CounterName = "TestCounter2"; ccd2.CounterHelp = "ここにTestCounter2の説明を書きます。"; ccd2.CounterType = System.Diagnostics.PerformanceCounterType.RateOfCountsPerSecond32; ccdc.Add(ccd2); //カテゴリを登録する System.Diagnostics.PerformanceCounterCategory.Create( "Test Category", "ここにTest Categoryの説明を書く。", ccdc); //.NET Framework 2.0以降では次のようにPerformanceCounterCategoryTypeを指定する //System.Diagnostics.PerformanceCounterCategory.Create( // "Test Category", // "ここにTest Categoryの説明を書く。", // System.Diagnostics.PerformanceCounterCategoryType.MultiInstance, // ccdc);
カウンタにインスタンスを追加するには、PerformanceCounterオブジェクトのInstanceNameプロパティに追加するインスタンス名を設定し、RawValueプロパティに適当な値を設定します。カウンタのInstanceNameプロパティに設定されたインスタンスが無い時、値が設定されると、インスタンスが作成されます。
インスタンスを削除するには、PerformanceCounter.RemoveInstanceメソッドを使います。
インスタンスの追加と削除は動的に行うことができます。
'PerformanceCounterオブジェクトを作成 'インスタンス名を"0"とする Dim pc As New System.Diagnostics.PerformanceCounter( _ "Test Category", "TestCounter", "0", False) '生の値を設定する pc.RawValue = 0 '新しいインスタンス"1"を追加する pc.InstanceName = "1" pc.RawValue = 100 'インスタンスを削除する pc.RemoveInstance()
//PerformanceCounterオブジェクトを作成 //インスタンス名を"0"とする System.Diagnostics.PerformanceCounter pc = new System.Diagnostics.PerformanceCounter( "Test Category", "TestCounter", "0", false); //生の値を設定する pc.RawValue = 0; //新しいインスタンス"1"を追加する pc.InstanceName = "1"; pc.RawValue = 100; //インスタンスを削除する pc.RemoveInstance();
Visual Studioでは、「ツールボックス」の「コンポーネント」内に「PerformanceCounter」があります。フォームデザイナを使って、「PerformanceCounter」コンポーネントをフォームに配置して使用することもできます。
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。