SHOEISHA iD

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

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

ComponentZine(PlusPak)

ディスクアクセス状況を通知する.NETアプリケーションを作る

PlusPak for Windows Forms 5.0Jのプログレスバーを使ったアプリケーションの作成

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

Tickイベントの処理

 実際にカウンタ値を取得する処理は、TimerコントロールのTickイベントハンドラで行います。既にTimerコントロールはIntervalプロパティを100ミリ秒に設定しているので、この時間間隔でプログレスバーの表示を更新するようにします。

オブジェクト変数の宣言

 PerformanceCounterクラスはSystem.Diagnostics名前空間に属しているので、この名前空間をインポートします。

 また、PerformanceCounterクラスのインスタンスへの参照を格納するオブジェクト変数を使用しますが、この変数宣言をモジュールレベルで行います。Tickイベントハンドラ内で宣言すると、毎回PerformanceCounterクラスのインスタンスを作成することになってしまい、プログラムは正常に動作しませんので注意してください。

 なお、このプログラムでは、筆者のコンピュータに実装されている論理ドライブ「C」「E」「J」の3つのを対象にしています。サンプルプログラムの実行ファイルは、ドライブCのみ動作するように作成してありますが、違うドライブでも試したい場合は以降のコードのドライブ名を変更して使用してください。

Visual Basic
Imports System.Diagnostics

Public Class Form1
Private Disc1, Disc2, Disc3 As New PerformanceCounter()
C#
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つのプロパティに、取得するカウンタのカテゴリ名、カウンタ名、インスタンス名を記述します。インスタンス名はドライブ名に「:」を付けた文字列になります。

Visual Basic
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:"
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型なので、データ型変換を行ってください。

Visual Basic
p1 = Disc1.NextValue()
If p1 > Me.GcProgressBar1.Maximum Then
    p1 = Me.GcProgressBar1.Maximum
End If
Me.GcProgressBar1.Value = CInt(p1)
C#
p1 = Disc1.NextValue();
if (p1 > (float)gcProgressBar1.Maximum)
{
    p1 = (float)gcProgressBar1.Maximum;
}
gcProgressBar1.Value = (decimal)p1;

残りのドライブの処理

 同じように、残りのドライブの処理も作成します。違うのは、「InstanceName」プロパティの値とGcProgressBarコントロールのオブジェクト名だけです。

 これでできあがりです。

Visual Basic
'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)
C#
//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メータやメモリメータを表示するものがいくつもありますが、多分仕組みは同じようにパフォーマンスカウンタで情報を取得し、グラフィックスなどで視覚化しているだけだと思います。使い方によっては、ユーザーの役に立つアプリケーションを作ることができるでしょう。

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

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

もっと読む

この記事の著者

瀬戸 遥(セト ハルカ)

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

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

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

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3238 2009/03/17 12:12

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング