忍者ブログ

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

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

VB.NET:スレッドタイマ(System.Threading.Timer)を使った割込み処理について
VB.NETのコンソールプログラムでのタイマ割込み処理を行う場合、 スレッドタイマ(System.Threading.Timer)を使った方法があります。

フォームを持ったプログラムの場合には、Windowsタイマ(System.Windows.Forms.Timer)を 使えば簡単に割込み処理ができます。フォームにWindowsタイマのコントロールを張り付けて 各種のプロパティを設定すればOKです。

ただ、コンソールプログラムではフォームが無い場合が普通です。 そのため、タイマコントロールとは違う、スレッドタイマを使います。 以下のソースを見てください。

Main関数の処理の最初で、タイマイベント用の関数を宣言しています。 この関数はタイマ割込みが発生した時に実行する関数で、
次の行で生成されるタイマスレッドから実行されるデリゲートです。 タイマの間隔は1000msecに設定しています。

タイマイベントの関数では、タイマ割込みが在った証拠のフラグをONしているだけで、 メイン側ではそのフラグのONを見て、対応する処理を行っています。 例としては、現在時刻を表示しているだけです。

無限ループの中で、Sleep関数で待ち時間を使っています。 このSleep関数の行が無い状態でこのプログラムを実行すると、 CPU時間が非常に多く割かれてしまいます。 Sleepを入れることで、CPU時間はほぼ0%に近くなるはずです。

Module Test
    'タイマ処理フラグ
    Private mblnTimning As Boolean = False
    'タイマ
    Private mTimer As System.Threading.Timer

    ' 値渡し・参照渡しのテスト
    Public Sub Main()
        'タイマイベントの関数
        Dim timerDelegate As System.Threading.TimerCallback = _
                New System.Threading.TimerCallback(AddressOf TimerEvent)
        'タイマの生成と開始(1000msec毎のイベント呼び出し)
        mTimer = New System.Threading.Timer(timerDelegate, Nothing, 0, 1000)
        '無限ループ
        While True
            'タイマ処理フラグONの確認
            If mblnTimning = True Then
                'タイマ処理フラグOFF
                mblnTimning = False
                '処理の例として時刻表示
                Console.WriteLine(String.Format("Time = {0}", Now.ToString))
            End If
            '10msecの待ち処理(システムに処理を返す)
            System.Threading.Thread.Sleep(10)
        End While
    End Sub

    ' タイマイベント
    Public Sub TimerEvent(ByVal aobj As Object)
        'タイマ処理フラグON
        mblnTimning = True
    End Sub
End Module

このソースは無限ループの処理になっていて、無限ループを抜ける処理については 考えていませんので、何か対策が必要です。
無限ループの方法はあまりスマートでは無いのですが、常駐させる様なプログラムでは有効ではないでしょうか。


=====
2016/02/23:の時の情報











PR

コメント

コメントを書く