忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

Timerコントロールの使い方

標準コントロールの中では少し異質なTimerコントロールは、ある一定時間ごとに処理を行う時には必要になります。 今回の例は、そのTimerコントロールの簡単な使い方を説明します。

Timerコントロールを使うには、フォーム上にツールボックスからTimerを選択し貼り付けます。 以下の図は、Timerコントロールを貼り付けた後の様子です。


MSDNの説明によれば以下の様になっています。

Timer コントロール・について

<プロパティ>
・Enabled :タイマーが実行されているかどうかを取得または設定します。
・Interval:取得または設定の時間 (ミリ秒単位) 前に、 
            Tick の最後に見つかった位置を基準としたイベントは、 Tick イベントです。
<メソッド>
・Start() :タイマーを起動します。
・Stop()  :タイマーを停止します。
<イベント>
・Tick    :指定したタイマーの間隔が経過し、タイマーが有効である場合に発生します。

今回の例としては、フォーム上に Timer を貼り付け Tick イベントで 現在の時刻を表示し、時計の様な動作をします。

Timerコントロールの使い方

Public Class frmTimer

    ''' 
    ''' フォームロードイベント
    ''' 
    Private Sub frmTimer_Load(sender As Object, e As EventArgs) Handles Me.Load
        'ラベルに現在時刻表示
        Me.Label1.Text = Now.ToString("hh:mm:ss")
        'Timerの間隔を1000msec(1sec)に設定
        Me.Timer1.Interval = 1000
        'Timerを開始する
        Me.Timer1.Enabled = True
    End Sub

    ''' 
    ''' タイムTickイベント
    ''' 
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        'ラベルに現在時刻表示
        Me.Label1.Text = Now.ToString("hh:mm:ss")
    End Sub

End Class

今回の例は、プログラム的には非常に簡単なものです。 一つ注意する点としては、Timerの間隔設定の値がミリ秒である点です。
秒単位での間隔を設定するには、その秒数を1000倍した値をTimer.Intervalに設定します。

それでは、少しプログラムに手を加えて、Timerの中断、開始が出来る様にします。 中断、開始を行う為に2個のボタンコントロールをフォームに張り付けて、処理を追加します。 上記のソースにボタンClickイベントを追加したものを、以下に示します。

Timerコントロールの停止・開始の方法

Public Class frmTimer

    ''' 
    ''' フォームロードイベント
    ''' 
    Private Sub frmTimer_Load(sender As Object, e As EventArgs) Handles Me.Load
        'ラベルに現在時刻表示
        Me.Label1.Text = Now.ToString("hh:mm:ss")
        'Timerの間隔を1000msec(1sec)に設定
        Me.Timer1.Interval = 1000
        'Timerを開始する
        Me.Timer1.Enabled = True
    End Sub

    ''' 
    ''' タイムTickイベント
    ''' 
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        'ラベルに現在時刻表示
        Me.Label1.Text = Now.ToString("hh:mm:ss")
    End Sub

    ''' 
    ''' 「停止」ボタンクリックイベント
    ''' 
    Private Sub btnStop_Click(sender As Object, e As EventArgs) Handles btnStop.Click
        'Timerを停止する
        Me.Timer1.Stop()
    End Sub

    ''' 
    ''' 「開始」ボタンクリックイベント
    ''' 
    Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
        'Timerを開始する
        Me.Timer1.Start()
    End Sub

End Class

Timerの開始・停止メソッドのStart Stopを使用し処理していますが、 EnabledプロパティをTrue / Falseに設定することでも同じことが行えます。

ここで、Timerを使う上で注意することがあるのですが、タイムTickイベントの処理が Timerに設定したIntervalの値より掛かってしまったらどうなるかです。
そこで、タイムTickイベントの中に10秒の待ちを行う処理を入れてみました。

タイムTickイベントのみ抜粋

    ''' 
    ''' タイムTickイベント
    ''' 
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        'ラベルに現在時刻表示
        Me.Label1.Text = Now.ToString("hh:mm:ss")
        '10秒待たせる
        System.Threading.Thread.Sleep(10 * 1000)
    End Sub

タイムTickイベントの中に10秒の待ちを行う処理を入れると、 時刻の表示が10秒毎にしか変化しません。 タイムTickイベントが呼び出されて処理が終わるまでは、 次のイベントが呼び出されないことになります。

Intervalを超える処理時間が掛かった時に、次のイベントが呼び出されないことが良いかどうかは 求める仕様に関わってくると思います。

常にIntervalの時間間隔でイベントが呼び出される様にしたいのであれば、 このTimerコントロールでは無く、別の方式で行う必要があります。 この件に付いては別のページで説明したいと思います。

タイマコントロールではなく、スレッドを使ったタイマ処理は以下を参照して下さい。
スレッドタイマの使い方          :[System.Threading.Timer,Delegate,Invoke]
スレッドタイマの使い方(イベント処理が時間が掛かる場合):[System.Threading.Timer,Delegate,Invoke]

PR

コメント

コメントを書く