カクタスソフトウェア
カクタスソフトウェア
サウンド MIDI マルチメディア アプリケーション

タイマーイベント (.NET C#バージョン)

マネージ環境では以下に示す3つのタイマーが利用可能です。

System.Windows.Forms.Timer
FormやUserControlで使うためのタイマーです。
System.Timers.Timer
一般的な環境で使えるタイマーです。
System.Threading.Timer
上記タイマーのベースとなる基本的なタイマーです。

System.Windows.Forms.Timer

FormおよびUserControlの環境下ではSystem.Windows.Forms.Timerクラスを利用することができます。

このタイマーはあまり精度を必要としない用途に用います。精度の上限は55mSecです。より高い精度が必要なときは、System.Timers.Timerクラスを用います。

VisualStudioのツールボックスからTimerをダブルクリックするかデザイン画面にTimerをドラッグします。

タイマーを利用するときは、Tickイベントを実装し、Enabledプロパティをtrueにします。Tickイベントが呼び出される間隔はIntervalプロパティで設定します。

タイマーを起動するには、Start()コマンドを、停止させるには、Stop()コマンドを用います。

    // デザイナーのコード
    private void InitializeComponent()
    {
        this.timer1 = new System.Windows.Forms.Timer();
        this.timer1.Enabled = true;
        this.timer1.Interval = 200;
        this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
    }
    private System.Windows.Forms.Timer timer1;

このTimerクラスはシングルスレッド用に設計されているため、Tickイベントは自身のクラスの他のメソッドと同じスレッドで実行されます。

    // ユーザーコード
    private void timer1_Tick(object sender, EventArgs e)
    {
        // TODO:
    }
    private void startButton_Click(object sender, EventArgs e)
    {
        timer1.Start();
    }
    private void stopButton_Click(object sender, EventArgs e)
    {
        timer1.Stop();
    }

System.Timers.Timer

System.TimersのタイマーはSystem.Windows.Formsのタイマーと使い方は似ていますが、動作の様子が異なります。System.Timers.Timerはより一般的な環境で動作し、FormやUserControlのようなウィンドウが無くても使うことができます。

System.Windows.Forms.Timerではデザイナーが自動的にコードを生成してくれましたが、System.Timers.Timerは手動でコードを作成しなければなりません。以下にサンプルを示します。

using System.Timers;

public class MyClass
{
    private System.Timers.Timer myTimer;

    public void NewTimer()
    {
        myTimer = new System.Timers.Timer();
        myTimer.Enabled = true;
        myTimer.AutoReset = true;
        myTimer.Interval = 500;
        myTimer.Elapsed += new ElapsedEventHandler(OnTimerEvent);
    }

    private void OnTimerEvent(object source, ElapsedEventArgs e)
    {
        // TODO:
    }

    public void StartTimer()
    {
        myTimer.Start();
    }

    public void StopTimer()
    {
        myTimer.Stop();
    }
}

Enabledプロパティをtrueに、Elapsedイベントが発生する間隔はIntervalプロパティで設定します。AutoResetプロパティをfalseにするとシングルショットの動作を行い、trueでは定期的にElapsedイベントが発生します。

System.Windows.Forms.Timerとの最も大きな違いは、呼び出されるメソッドが、ThreadPoolスレッドで発生するという点です。ThreadPoolには作業用としていつでも使えるスレッドが待機しています。Elapsedイベントが実行されるスレッドは、ThreadPoolの中から任意に選ばれるため、どのスレッドで実行されるかは特定できません。

また上記例のOnTimerEvent()での作業が次の呼び出し時刻になっても終わっていない場合、新しいスレッドで次のOnTimerEvent()が呼び出されます。そのためOnTimerEvent()メソッドはスレッドフリーに作成する必要があります。

SynchronizingObject

FormやUserControlに関連付けてSystem.Timers.Timerを用いるときは次の注意が必要です。FormやUserControlが持つControlの操作は、そのControlを作成したスレッドに限られます。ThreadPoolのスレッドなど異なるスレッドから操作すると例外が発生します。これを防ぐためにSynchronizingObjectプロパティにFormやUserControlのインスタンスを設定します。これによってElapsedイベントがControlを作成したスレッドで実行されるようになります。

System.Windows.Forms.TimerはSynchronizingObjectプロパティに自動的にFormやUserControlのインスタンスを設定するようにしたものです。

System.Threading.Timer

System.Threading.TimerはMSDNにシンプルで動作が軽いとあります。しかし一般的なアプリケーションで使うには扱いが少々めんどうです。タイマーオブジェクトの作成にコールバック関数のデリゲートを必要としたり、何よりスタート・ストップコマンドがありません。このタイマーは他の便利なタイマーを実装するためのより基本的な実装と考えた方が良いかも知れません。

このタイマーはコールバック関数がThreadPoolで発生するので、FormやUserControlで利用することができません。一般的な用途には上記で紹介しているSystem.Windows.Forms.TimerやSystem.Timers.Timerの利用をお勧めします。

public Timer(
    TimerCallback callback,
    Object state,
    int dueTime,
    int period)

callback

System.Threading.TimerCallback()関数によって作成されるコールバック関数のデリゲートです。

state

コールバック関数に伝えられるユーザー変数です。

dueTime

最初にコールバック関数が呼び出されるまでの時間です。

period

コールバック関数が呼び出される間隔です。

    System.Threading.TimerCallback timerDelegate;
    System.Threading.Timer stateTimer;

    public void NewTimer()
    {
        timerDelegate = new System.Threading.TimerCallback(OnTimerEvent);
        stateTimer = new System.Threading.Timer(timerDelegate, myObject, 500, 500);
    }

    public void OnTimerEvent(Object obj)
    {
        // TODO:
    }

    public void DisposeTimer()
    {
        stateTimer.Dispose();
    }

タイマーはTimerオブジェクトを作成した時にスタートし、Dispose()メソッドの実行で破棄されます(停止します)。

ドキュメントの先頭へ

カクタスソフトウェア 技術協力 資料室 資料室の広場 SourceForge.jp お問い合わせ