.NET TIPS

タイマにより一定時間間隔で処理を行うには?(Windowsタイマ編)

デジタルアドバンテージ 遠藤 孝信
2005/11/11

 .NET Frameworkには一定時間間隔で処理を行う(メソッドを呼び出す)ためのタイマ機能として、以下の3種類のTimerクラスが用意されている。

Windowsタイマ:System.Windows.Forms.Timerクラス
スレッド・タイマ:System.Threading.Timeクラス (解説TIPSへ
サーバベース・タイマ:System.Timers.Timerクラス (解説TIPSへ

 本稿ではのWindowsタイマについて、その基本的な使い方をまとめる。

Windowsタイマ:System.Windows.Forms.Timerクラス

 Windowsアプリケーション(Windowsフォーム・アプリケーション)でタイマを利用したい場合には、通常System.Windows.Forms名前空間のTimerクラスを利用する。

 このタイマはWindows OSのタイマ・メッセージ(WM_TIMERメッセージ)をベースにしており、タイマを利用するにはメッセージ・ループの実行が必要である(一般的なWindowsフォーム・アプリケーションはApplication.Runメソッドの呼び出しを含んでおり、このメソッドによりメッセージ・ループが実行される)。

 このTimerクラスでは、EventHandlerデリゲート(System名前空間)を使用して、タイマにより呼び出されるメソッド(以下、タイマ・メソッドと記す)のデリゲートを作成し、TimerクラスのTickイベントに登録する(VB.NETではWithEvents /Handles キーワードによりイベントを登録することも可能)。

 タイマ・メソッドの呼び出し間隔はIntervalプロパティにより設定し(単位はミリ秒)、タイマの開始/停止は、Enabledプロパティにtrue/falseを設定して行う(あるいはStart/Stopメソッドを呼び出してもよい)。

 以下にWindowsタイマを使用したサンプル・プログラムを示す。このプログラムではTimerクラスに関する記述を分かりやすくするために、コンソール・アプリケーションとして記述している。MyClockメソッドがタイマにより一定間隔で実行されるメソッドである。

// formstimer.cs

using System;
using System.Windows.Forms;

public class FormsTimerTest {

  static void Main() {
    FormsTimerTest ftt = new FormsTimerTest();
    ftt.Run();
  }

  public void Run() {
    Timer timer = new Timer();
    timer.Tick += new EventHandler(MyClock);
    timer.Interval = 1000;
    timer.Enabled = true; // timer.Start()と同じ

    Application.Run(); // メッセージ・ループを開始
  }

  public void MyClock(object sender, EventArgs e) {
    Console.WriteLine(DateTime.Now);
    // 出力例:
    // 2005/11/08 19:59:10
    // 2005/11/08 19:59:11
    // 2005/11/08 19:59:12
    // ……
  }
}

// コンパイル方法:csc formstimer.cs
Windowsタイマを使用したC#のサンプル・プログラム(formstimer.cs)
 
' formstimer.vb

Imports System
Imports System.Windows.Forms

Public Class FormsTimerTest

  Shared Sub Main()
    Dim ftt As FormsTimerTest = New FormsTimerTest()
    ftt.Run()
  End Sub

  Public Sub Run()
    Dim timer As Timer = New Timer()
    AddHandler timer.Tick, New EventHandler(AddressOf MyClock)
    timer.Interval = 1000
    timer.Enabled = true ' timer.Start()と同じ

    Application.Run() ' メッセージ・ループを開始
  End Sub

  Public Sub MyClock(sender As Object, e As EventArgs)
    Console.WriteLine(DateTime.Now)
    ' 出力例:
    ' 2005/11/08 19:59:10
    ' 2005/11/08 19:59:11
    ' 2005/11/08 19:59:12
    ' ……
  End Sub
End Class

' コンパイル方法:vbc vbc /r:System.dll /r:System.Windows.Forms.dll formstimer.vb
Windowsタイマを使用したVB.NETのサンプル・プログラム(formstimer.vb)

 Visual Studioでプログラミングしている場合には、ツールボックスの[Windowsフォーム]タブから「Timerコンポーネント」をフォームにドラッグ&ドロップするだけでタイマが利用可能な状態となる。配置したTimerコンポーネントをダブルクリックすれば、タイマ・メソッド(Tickイベント・ハンドラ)が自動的に作成される。

Windowsタイマを利用するときの注意点

 なお冒頭で述べたように、このタイマはWindows OSのメッセージをベースとしているため、タイマ・メッセージが発生したときにほかのメッセージの処理を行っているとタイマ・メソッドは呼び出されない。また、その間に発生した複数のタイマ・メッセージは1つにまとめられる。

 例えば、呼び出し間隔を1秒に設定したタイマを開始し、ボタンがクリックされたときの処理を3秒間にわたって行ったとすると、タイマ・メソッドが呼び出されるのはボタンのクリック処理が終わった直後となる。

 このため、Windowsアプリケーションで定期的な処理を確実に実行したい場合には、マルチスレッドにより動作する(前述の)ほかの2つのタイマの利用を検討する必要がある。

.NET Framework 1.1におけるWindowsタイマのバグ情報

 System.Windows.Forms.Timerクラスについては現在、以下のバグがMicrosoftより報告されている。

 これは.NET Framework 1.1 SP1(Service Pack 1)を適用した環境において、System.Windows.Forms.TimerクラスのEnabledプロパティをfalseに設定した場合に、Windowsフォーム・アプリケーションがフリーズしてしまうことがあるというバグだ。

 System.Windows.Forms.Timerクラスを使っていてWindowsアプリケーションが不意に停止するような不可解な挙動が起こる場合には、このバグ情報をチェックしていただきたい。

 なおこの問題を修正するHotFixは、(2005年11月10日時点で)マイクロソフト・サポート契約センターに問い合わせることで入手できる。ただしこれはあくまで臨時的な解決策なので、もしこの問題に直面していない場合は正式なService Packのリリースを待った方がよい。End of Article

カテゴリ:Windowsフォーム 処理対象:Timerコンポーネント
使用ライブラリ:Timerコンポーネント(System.Windows.Forms名前空間)
使用ライブラリ:EventHandlerデリゲート(System名前空間)
関連TIPS:タイマにより一定時間間隔で処理を行うには?(スレッド・タイマ編)
関連TIPS:
タイマにより一定時間間隔で処理を行うには?(サーバベース・タイマ編)

この記事と関連性の高い別の.NET TIPS
タイマにより一定時間間隔で処理を行うには?(スレッド・タイマ編)
タイマにより一定時間間隔で処理を行うには?(サーバベース・タイマ編)
[Silverlight 2]タイマを利用するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」

TechTargetジャパン

Insider.NET フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH