SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

メモリの使用量をPerformanceCounterクラスで表示する

パフォーマンスデータ利用の基本例


  • このエントリーをはてなブックマークに追加

メモリの使用量をPerformanceCounterクラスを使ってリアルタイムに把握し、フォームとコントロールで表示するプログラムを作成。

  • このエントリーをはてなブックマークに追加
CPUの負荷状況をリアルタイムに描画
CPUの負荷状況をリアルタイムに描画

はじめに

 2004年11月号のdotnetマガジン連載「Visual Basic.NET タマヒヨ倶楽部」の記事で、Windowsの管理ツールの中にある「パフォーマンス」のような、CPUの負荷状況をリアルタイムに描画して表示するプログラムを作成しました。

 記事では、CPUの占有率情報を取得し、アナログメーターのようなゲージを作成して表示するプログラムを作成してみましたが、今回はメモリの使用量をPerformanceCounterクラスを使ってリアルタイムに把握し、フォームとコントロールで表示するプログラムを作成してみます。

対象読者

 Visual Basic.NETを利用してプログラムを作成したことのある方を対象としています。

必要な環境

 記事は、Visual Basic.NET2003、.Net Framework1.1で作成・動作確認を行っています。

PerformanceCounterクラスについて

 「パフォーマンス」というツールは、コントロールパネルアプレットで提供されており、システムの状態を監視し結果をグラフなどで表示するプログラムです。メモリのページファイル、ディスクアクセスの状態、CPUの占有度を、時間の経過とともに折れ線グラフで表示することができます。

 Visual Basic.NETでは、.NET Frameworkの中にある、「PerformanceCounter」と呼ばれるクラスを使うことで、「パフォーマンス」が使用する情報を、独自のプログラムに組み込んで使うことができます。

 パフォーマンスカウンタは、情報量がとても多いので、情報の種類ごとに「Category」と呼ばれる分類がなされ、「Category」内にさらに「Counter」「Instance」と階層構造で情報が分類されて格納されています。

 .NET FrameworkクラスライブラリのPerformanceCounterクラスは、コントロールパネルアプレットの「パフォーマンス」と同様、複数のカウンタを設定して、カウンタごとに違う情報を表示し、自作のプログラム内で使用することが可能になっています。

GUIの作成

 ユーザーインターフェイスは、フォームとPanelLabelTimerコントロールで仕上げます。

  1. フォームに次のプロパティを設定します。今回は、プログラム実行時にフォームのサイズをユーザーによって変えられないようにしています。FormBorderStyleプロパティを「FixedDialog」に設定すると、プログラム実行時フォームのサイズを変えることができなくなります。また、MaximumSizeBoxプロパティを「False」にすると、フォームの右端に付く「最大化」ボタンを無効にできます。
     
     
    フォームの設定プロパティ
    プロパティ 設定値
    BackColor Silver
    FormBorderStyle FixedDialog
    Icon MSGBOX03.ICO
    MaximumSizeBox False
    Text 空きメモリ
     
     
    「最大化」ボタンがグレー表示となり、プログラム実行時はこのボタンが使えないので、プログラムを最大化できない
    「最大化」ボタンがグレー表示となり、プログラム実行時はこのボタンが使えないので、プログラムを最大化できない
     
  2. インジケーターのマーカーは、Panelコントロールの中にLabelコントロールを入れて、LabelコントロールのBackColorプロパティを使って色を付けています。立体表示は、BorderStyleプロパティを「Fixed3D」に設定します。
     
    Panelコントロールは、「コンテナコントロール」と呼ばれる機能を持ったコントロールで、他のコントロールを自分の中に組み込むことができます。
    マーカーは、1つ作成したら、あとは必要な数をコピーすれば簡単です。必要な数を配置したら、Panel内のLabelコントロールのBackColorプロパティで背景色を塗りつぶします。
     
    Panelコントロールの中にLabelコントロールをドラッグ & ドロップする
    Panelコントロールの中にLabelコントロールをドラッグ & ドロップする
     
     
  3. インジケーターの中央に配置するメーターは、Labelコントロールを使用します。
    ProgressBarコントロールを使ってもいいのですが、ProgressBarコントロールだと途中でマークの色を変えることができません。
     
    今回は、残メモリ量によってマークの色を変えるようにしたいので、LabelコントロールとTextプロパティ、ForeColorプロパティでメーターを表示するようにします。
    BorderStyleプロパティを「Fixed3D」に設定し、Textプロパティに「■」を17個入れ、Labelコントロールのサイズをこれに合わせるようにします。
    なお、Labelコントロールはオブジェクト名を「Labelmeter」に変更しています。
     
  4. できあがったら、フォームをコントロールのサイズに合わせ、Timerコントロールを配置します。
    Enabledプロパティをプロパティウィンドウで「True」にしておきます。
    また、フォームの右端にある「閉じる」(×)ボタンは有効なので、このボタンでプログラムを終了するようにします。
     
    フォームのデザイン画面
    フォームのデザイン画面

プログラムについて

 このプログラムは、次のような動作をします。

  1. フォーム起動時に、PerformanceCounterクラスからオブジェクトインスタンスを作成し、取得したいカテゴリ、カウンタ名を設定し、その情報を1度取得。
  2. TimerコントロールのTickイベントプロシージャで、そのデータを使い、残メモリ量によって、マークの色を変えてLabelコントロールでメーターを表示。
  3. メーターのマークは文字の「■」で、その都度残メモリ量に合わせて文字数を決定。

PerformanceCounterクラスとカウンタ情報の取得方法

 PerformanceCounterクラスを使ってメモリ情報を取得するには、どのカテゴリにあるのかを探さなければなりません。

 方法としては、次の2つがあります。

  1. Windowsのコントロールパネルから「管理ツール-パフォーマンス」を選び、「カウンタの追加」ダイアログボックスでパフォーマンスオブジェクトとカウンタを探す。パフォーマンスオブジェクトがPerformanceCounterクラスのCategoryNameプロパティに、カウンタがCounterNameプロパティに対応している。
     
     
     
  2. Visual Basic.NETの「サーバエクスプローラ」からコンピュータ名を展開し、「パフォーマンスカウンタ」から探す。
     
     

 今回は、利用可能な空きメモリを取得しますので、カテゴリ名は「memory」、カウンタ名は「Available MBytes」を選び、MB単位で空きメモリ量を取得します。

PerformanceCounterオブジェクトを作成し操作する方法

 通常、コードでPerformanceCounterクラスのインスタンスを作成する場合は、CategoryNameプロパティにカテゴリ名を、CounterNameプロパティに取得する値のあるカウンタ名を設定します。

 MachineNameプロパティには、使用するコンピュータ名を設定しますが、ここにコンピュータ名を設定すると、そのコンピュータのパフォーマンスしか取得できなくなります。他のコンピュータでも動かすには、MachineNameプロパティに「.」を設定しておきます。

 コンピュータ名は空白でも、カウンタの値を取得することができます。これであれば、コンピュータ固有の情報ではなく、どのコンピュータでも同じカテゴリのカウンタがあれば、その情報を取得することができます。そして、カウンタの値はNextValueプロパティに格納されます。

  1. まず、変数を2つ宣言します。いずれも、複数のプロシージャから参照されることになるので、モジュールレベルで宣言します。
     
        Dim MemCounter As New PerformanceCounter
        Dim pt As Single
    
     
    MemCounterは、これから情報を取得するPerformanceCounterクラスのオブジェクトインスタンスへの参照を格納します。必ず、格納するオブジェクトと同じデータ型で宣言してください。また、宣言と同時にNewキーワードを使ってオブジェクトを作成し、そこへの参照を代入しています。変数ptは、カウンタの値をMB単位で値を取得するので小数点を格納できるように、Singleで宣言します。
     
  2. 次に、フォームのLoadイベントプロシージャを作成します。ここで、パフォーマンスカウンタを作成し、値が取り出せる状態にしておきます。
    CategoryNameプロパティにカテゴリ名「memory」を、CounterNameプロパティに取得する値のあるカウンタ名「Available MBytes」を、MachineNameプロパティに「.」を設定します。いずれも、文字列で設定する点に注意してください。
     
    Private Sub Form1_Load(ByVal sender As System.Object, 
                ByVal e As System.EventArgs) Handles MyBase.Load
        MemCounter.CategoryName = "memory"
        MemCounter.CounterName = "Available MBytes"
        MemCounter.MachineName = "."
    
     
    カウンタを作成したら、NextValueプロパティから現在の値を取得し変数に格納しておきます。
     
        pt = MemCounter.NextValue
    End Sub
    
     

 これで、カウンタ「Available MBytes」-利用可能な空きメモリ量をMB単位で取得できました。

カウンタの値を取得する

 今度は、TimerコントロールのTickイベントプロシージャで、100ミリ秒ごとにカウンタの値を取り出し、Labelコントロールのメーターに表示します。

  1. プロシージャの冒頭で、NextValueプロパティからカウンタの値を取り出します。そして、フォームのTextプロパティに、「MB」という文字を付けて表示します。
     
    Private Sub Timer1_Tick(ByVal sender As System.Object, 
                ByVal e As System.EventArgs) Handles Timer1.Tick
        pt = MemCounter.NextValue
        Me.Text = pt & "MB"
    
     
     
  2. Labelコントロールの文字色の設定を行います。
    変数ptの値を調べ、75以上であれば文字色を緑(PaleGreen)に、75から51の間であれば黄色に、50から26の間であればオレンジに、25から0の間はマゼンタになるように、LabelコントロールのForeColorを設定します。
    なお、Case節では、キーワードIsで比較演算子による値評価、キーワードToで範囲による値評価となります。
     
        With Labelmeter
            Select Case pt
                Case Is > 75
                    .ForeColor = System.Drawing.Color.PaleGreen
    
                Case 51 To 75
                    .ForeColor = System.Drawing.Color.Yellow
    
                Case 26 To 50
                    .ForeColor = System.Drawing.Color.DarkOrange
    
                Case 0 To 25
                    .ForeColor = System.Drawing.Color.Magenta
            End Select
    
     
  3. 文字色が決まったら、今度は■の文字数を決めます。これは、メモリ量が5MBごとに1文字になるように、5で割ってInt関数で整数部だけを取り出します。
    また、たとえば残メモリが1GB もあると、■が200文字にも達してしまいます。あまり多い量を表示しても意味がないので、19文字以上になる場合は最大で19文字まで表示するようにしておきます。
     
            Dim i, cnt As Byte
            Dim mark As String
    
            cnt = Int(pt / 5)
            If cnt >= 19 Then
                cnt = 19
            End If
    
     
  4. 文字数が決まったら、一度現在のLabelコントロールの表示を消してから、新たに■を表示するようにします。すなわち、Tickイベントプロシージャが呼び出されるごとに、メーターの表示を更新するわけです。
    「■」の設定は、文字数をFor...Nextステートメントに設定し、変数への代入を自動的に繰り返すようにします。表示する文字ができたら、LabelコントロールのTextプロパティに代入します。
     
            mark = ""
            For i = 1 To cnt
                mark = mark + "■"
            Next
    
            Labelmeter.Text = mark
        End With
    End Sub
    
     
    これで、たとえば残メモリが20MBになればマゼンタで、52MB になれば黄色でメーターが表示されます。
     
    残メモリの表示
    残メモリの表示
メモリ残量と表示について
 このプログラムでは、メモリ残量が75MB以下からアラート表示するように設計しましたが、機種によっては100MB以上も空き容量のあるものがあります。それらに対応させて表示を変えたい場合は、
cnt = Int(pt / 5)
 の5の部分を変えて■1つ当たりのMB数を大きくしたり、空きメモリの警戒ラインである75MBを変えるなど、式を変えて対応させてください。
 

まとめ

 今回は、.NET Frameworkクラスライブラリにある、PerformanceCounterクラスで実装メモリの空き容量を把握するプログラムを作成しました。まとめると次のようになります。

  • PerformanceCounterクラスを使って、メモリ情報やディスクの空き容量、CPU・プロセス占有率などの情報を取得することができる。
  • 空きメモリ量の情報を取得するには、CategoryNameCounterNameMachineNameプロパティを使用して、PerformanceCounterクラスのインスタンスを作成する。カウンタの値はNextValueプロパティに格納される。

参考資料(リンク)

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

瀬戸 遥(セト ハルカ)

8ビットコンピュータの時代からBASICを使い、C言語を独習で学びWindows 3.1のフリーソフトを作成、NiftyServeのフォーラムなどで配布。Excel VBAとVisual Basic関連の解説書を中心に現在まで40冊以上の書籍を出版。近著に、「ExcelユーザーのためのAccess再...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/21 2008/08/19 20:49

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング