VB.NETのコンソールプログラムでのタイマ割込み処理を行う場合、 スレッドタイマ(System.Threading.Timer)を使った方法があります。
フォームを持ったプログラムの場合には、Windowsタイマ(System.Windows.Forms.Timer)を 使えば簡単に割込み処理ができます。フォームにWindowsタイマのコントロールを張り付けて 各種のプロパティを設定すればOKです。
ただ、コンソールプログラムではフォームが無い場合が普通です。 そのため、タイマコントロールとは違う、スレッドタイマを使います。 以下のソースを見てください。
Main関数の処理の最初で、タイマイベント用の関数を宣言しています。 この関数はタイマ割込みが発生した時に実行する関数で、
次の行で生成されるタイマスレッドから実行されるデリゲートです。 タイマの間隔は1000msecに設定しています。
タイマイベントの関数では、タイマ割込みが在った証拠のフラグをONしているだけで、 メイン側ではそのフラグのONを見て、対応する処理を行っています。 例としては、現在時刻を表示しているだけです。
無限ループの中で、Sleep関数で待ち時間を使っています。 このSleep関数の行が無い状態でこのプログラムを実行すると、 CPU時間が非常に多く割かれてしまいます。 Sleepを入れることで、CPU時間はほぼ0%に近くなるはずです。
このソースは無限ループの処理になっていて、無限ループを抜ける処理については 考えていませんので、何か対策が必要です。
無限ループの方法はあまりスマートでは無いのですが、常駐させる様なプログラムでは有効ではないでしょうか。
=====
2016/02/23:の時の情報
フォームを持ったプログラムの場合には、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
コメント