連載:Windowsフォーム開発入門【Visual Studio 2010対応】

Windowsフォーム・コントロールの基礎(その3)

初音 玲
2010/10/19
Page1 Page2 Page3 Page4

PerformanceCounterコンポーネント

 PerformanceCounterコンポーネント(以下、PerformanceCounter)は、Windowsに付属しているパフォーマンス・モニタの情報を取得するためのコンポーネントだ。このコンポーネントとChartコントロールを組み合わせれば、パフォーマンス・モニタのグラフのようなUIをWindowsフォームに追加できる。

Processコンポーネント

 Processコンポーネント(以下、Process)は、ほかのプログラムを起動するときに使うコンポーネントだ。Processを使えば、起動したプログラムに対して、終了を待ち合わせたり強制終了させたりすることもできる。

 下記のコードはProcessの利用例だ。なおWindowsフォーム上には、「Start_Button」「Wait_Button」「Kill_Button」という名前の3つのButtonコントロールと、「Process1」という名前のProcessを配置している。

Public Class Process_Form

  Private Sub Start_Button_Click( _
      ByVal sender As Object, ByVal e As EventArgs) _
          Handles Start_Button.Click
    Me.Process1.StartInfo.FileName = "notepad.exe"
    Me.Process1.Start()
  End Sub

  Private Sub Wait_Button_Click( _
      ByVal sender As Object, ByVal e As EventArgs) _
          Handles Wait_Button.Click
    Me.Process1.WaitForExit()
    MessageBox.Show( _
      Me.Process1.StartInfo.FileName & " 終了", _
      Me.Text, _
      MessageBoxButtons.OK)
  End Sub

  Private Sub Kill_Button_Click( _
      ByVal sender As Object, ByVal e As EventArgs) _
          Handles Kill_Button.Click
    Me.Process1.Kill()
  End Sub

End Class
namespace WindowsProcessCs
{
  public partial class Process_Form : Form
  {
    public Process_Form()
    {
      InitializeComponent();
    }

    private void Start_Button_Click(object sender, EventArgs e)
    {
      this.Process1.StartInfo.FileName = "notepad.exe";
      this.Process1.Start();
    }

    private void Wait_Button_Click(object sender, EventArgs e)
    {
      this.Process1.WaitForExit();
      MessageBox.Show(
        this.Process1.StartInfo.FileName + " 終了",
        this.Text,
        MessageBoxButtons.OK);
    }

    private void Kill_Button_Click(object sender, EventArgs e)
    {
      this.Process1.Kill();
    }
  }
}
リスト7 Processの使用例(上:VB、下:C#)
ButtonコントロールのClickイベント・プロシージャ(=Start_Button_ClickメソッドとWait_Button_ClickメソッドとKill_Button_Clickメソッド)は、Windowsフォーム・デザイナのフォーム画面上に配置した各Buttonコントロールをダブルクリックすると、そのひな型コードが自動的に生成される。

 サンプルという性質上、StartメソッドとWaitForExitメソッドは別のイベント・プロシージャに分けているが、起動したプログラムの終了を待ち合わせる処理を実装する場合は、(これらは別のイベント・プロシージャに分離せずに)Startメソッドの直後にWaitForExitメソッドを実行するのが一般的だ。

 しかし、WaitForExitメソッドを実行するとWindowsフォームの移動なども含めたUI操作が無視されてしまうので、(プログラムの終了を待ち合わせている間にもUI操作が必要な場面では)ProcessのStartメソッドとWaitForExitメソッドの実行をBackgroundWorkerで別スレッド化することも考慮に入れておいた方がいいだろう。

SerialPortコンポーネント

 SerialPortコンポーネント(以下、SerialPort)はRS-232Cなどのシリアルポートを使うためのコンポーネントだ。PC間のデータのやりとりはTCP/IPなどのプロトコルが主流になってきたが、制御機器などとのデータのやりとりはRS-232C経由となるときもあるので、そのようなときにSerialPortを使うことになる。

ServiceControllerコンポーネント

 ServiceControllerコンポーネント(以下、ServiceController)は、Windowsサービスの情報を取得したり起動や停止を行ったりすることができるコンポーネントだ。なお、起動や停止には、UACによる管理者への権限昇格が必要になるので、DirectoryEntryと同様に、app.manifestファイルを作成し、<requestedExecutionLevel>要素のlevel属性に「requireAdministrator」を指定する。

Timerコンポーネント

 Timerコンポーネント(以下、Timer)は、非UIデザイン系のコンポーネントの中で利用頻度が高い部類に入るコンポーネントだ。

 Windowsフォーム・アプリケーション内でずっと立ち上げておいて、定期的に状況を監視して、その状況報告を表示するような処理を行いたいときに、Timerは役立つ。Timerを使えば、指定したミリ秒数でTickイベントが発生して、自動的にイベント・プロシージャが呼び出されるので、その中に処理を記述すればよい。

 例えば、1秒ごとに(1000ミリ秒ごとに)CPU使用率を測定してProgressBarに表示するためには、次のようなコードを記述する。Timerを使うためのコードはEnabledプロパティの有効/無効くらいで、大半がCPU使用率を表示する部分であることに注目してほしい。このようにTimerは簡単に使えるということだ。

 なおWindowsフォーム上には、「CPU_ProgressBar」という名前のProgressBarコントロールと、「Timer1」という名前のTimer1、「PerformanceCounter1」という名前のPerformanceCounterを配置している。

 さらに、PerformanceCounterコンポーネントのプロパティ設定が必要だ。具体的には、Windowsフォーム・デザイナのフォーム画面上に配置したPerformanceCounterコンポーネントを選択した状態で、[プロパティ]ウィンドウの[MachineName]プロパティに「.」を、[CategoryName]プロパティに「Processor」を、[CounterName]プロパティに「% Processor Time」を、[InstanceName]プロパティに「_Total」を、それぞれ入力する(MachineNameプロパティ以外は、入力欄の右端の[▼]ボタンをクリックすると表示されるリストから選択可能)。

Public Class Timer_Form

  Private Sub Timer_Form_Shown( _
      ByVal sender As Object, ByVal e As EventArgs) _
          Handles Me.Shown
    Me.Timer1.Interval = 1000
    Me.Timer1.Enabled = True
  End Sub

  Private Sub Timer1_Tick( _
      ByVal sender As Object, ByVal e As EventArgs) _
          Handles Timer1.Tick
    Me.Timer1.Enabled = False
    Try
      Dim processTime As Single = Me.PerformanceCounter1.NextValue
      If Me.CPU_ProgressBar.Maximum < processTime Then
        Me.CPU_ProgressBar.Maximum = processTime
      End If
      Me.CPU_ProgressBar.Value = processTime
    Catch ex As Exception
      MessageBox.Show(ex.Message, Me.Text, MessageBoxButtons.OK)
    End Try
    Me.Timer1.Enabled = True
  End Sub

End Class
namespace WindowsTimerCs
{
  public partial class Timer_Form : Form
  {
    public Timer_Form()
    {
      InitializeComponent();
    }

    private void Timer_Form_Shown(object sender, EventArgs e)
    {
      this.Timer1.Interval = 1000;
      this.Timer1.Enabled = true;
    }

    private void Timer1_Tick(object sender, EventArgs e)
    {
      this.Timer1.Enabled = false;
      try
      {
        float processTime =
          this.PerformanceCounter1.NextValue();
        if (this.CPU_ProgressBar.Maximum < processTime)
        {
          this.CPU_ProgressBar.Maximum = (int)processTime;
        }
        this.CPU_ProgressBar.Value = (int)processTime;
      }
      catch (Exception ex)
      {
        MessageBox.Show(
          ex.Message, this.Text, MessageBoxButtons.OK);
      }
      this.Timer1.Enabled = true;
    }
  }
}
リスト8 Timerの使用例(上:VB、下:C#)
フォームのShownイベント・プロシージャ(=Timer_Form_Shownメソッド)は、Windowsフォーム・デザイナのフォーム画面を選択した状態で、[プロパティ]ウィンドウの[イベント]一覧のイベント項目をダブルクリックすると自動生成される。TimerのTickイベント・プロシージャ(=Timer1_Tickメソッド)は、Timerをダブルクリックすると自動生成される。

まとめ

 3回にわたってWindowsフォームで使用する基本的なコントロールを説明してきた。これらの基本的なコントロールを組み合わせれば、ちょっとしたプログラムから本格的な業務アプリケーションまで、さまざまなWindowsフォーム・アプリケーションを作ることができる。そこで次回から、画面デザインと両輪となるデータ・バインディングなど、業務アプリケーション構築に必須な部分について説明していく。

 もちろん、これまで紹介してきたWindowsフォーム・コントロールを使っていくので、どのようなUIにはどのようなコントロールを当てはめるべきか、ぜひ、頭の中でイメージできるように読み返していただき、次回をお待ちいただきたい。End of Article


 INDEX
  [連載]Windowsフォーム開発入門【Visual Studio 2010対応】
  Windowsフォーム・コントロールの基礎(その3)
    1.コンポーネント(1):BackgroundWorker
    2.コンポーネント(2):DirectoryEntry/DirectroySearcher/ErrorProvider/EventLog
    3.コンポーネント(3):FileSystemWatcher/HelpProvider/ImageList/MessageQueue
  4.コンポーネント(4):PerformanceCounter/Process/SerialPort/ServiceController/Timer

インデックス・ページヘ  「Windowsフォーム開発入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH