前回「その2」では「メイン処理をスレッドにしたもので行います」と記しましたが、実際のプログラム例を示します。
プログラムの手順としては以下の様になります。
- OnStart ではイベントログに開始メッセージを登録し、メイン処理スレッドの生成を行う。
- OnStop ではイベントログに停止メッセージを登録し、メインスレッド停止依頼フラグONし、メイン処理スレッドの生成を行う。
- メイン処理スレッドでは停止依頼フラグがONになるまでループ処理を行う。ループ内では Sleep で待ちを入れる。
■サービスPG・メイン処理をスレッド化
Public Class TestService Protected Overrides Sub OnStart(ByVal args() As String) ' サービスを開始するコードをここに追加します。このメソッドによって、 ' サービスが正しく実行されるようになります Me.EventLog.WriteEntry("サービスを開始します。") 'メイン処理スレッドの生成を行う Me.mThreadMain = New Threading.Thread(New Threading.ThreadStart(AddressOf Me.MainProc)) Me.mThreadMain.Start() End Sub Protected Overrides Sub OnStop() ' サービスを停止するのに必要な終了処理を実行するコードをここに追加します。 Me.EventLog.WriteEntry("サービスを停止します。") 'メインスレッド停止依頼フラグON Me.mblnThreadStop = True 'メインスレッドの停止を待つ Me.mThreadMain.Join() End Sub ' スレッドクラス Private mThreadMain As Threading.Thread ' スレッド停止フラグ Private mblnThreadStop As Boolean = False ' メイン処理スレッド Private Sub MainProc() Me.EventLog.WriteEntry("MainProc...開始。") Try While mblnThreadStop = False ' ここに本来のサービス処理を書く ' 待ち時間を入れる(このプロセスがCPUを独占しない様に) Threading.Thread.Sleep(100) End While Catch ex As Exception ' エラー処理があればここに書く End Try Me.EventLog.WriteEntry("MainProc...停止。") End Sub End Class
このプログラムの重要な点は、サービスの「開始」が行われた時に、 メイン処理をスレッドとして起動を掛けて即座に「開始」処理から抜け出るところです。 こうするのは「開始」処理の中では時間の掛かる処理が実行できないからです。
また、メインスレッド内でも Sleep 関数での待ちを入れていますが、 これが無いとこのスレッドがCPU時間を独占することになりますので、必要になります。
しかし、まだこれではサービスプログラムの枠を作っただけで、実際に何も処理は起こりません。
サービスプログラムが何を行うのかが、決まっていないからですが、 上記のソース内の「ここに本来のサービス処理を書く」の部分に書いていくことになります。
さて、今回のサービスプログラムを実際に「開始」し、「停止」した場合のイベントログを見てみます。
「コントロールパネル」⇒「管理ツール」⇒「イベント ビューアー」で起動し、 実際にイベントログが登録されているかを見てみます。
確かにログは登録されている様ですが、上から6件のログを一覧で見てみます。
ログの一覧を表示するには、Windowsの powershell を起動し Get-EventLog コマンドを使います。
それでは 「Windows + R」 で「ファイル名を指定して実行」を開き、 powershell を起動します。
(尚 Get-EventLog の詳しい説明はここでは行いません)
powershell 起動後、以下のコマンドをキー入力してログ一覧を行います。
- Get-EventLog Application -Newest 6
ログを見ますと、期待した通りの結果が得られました。
次の記事ではメイン処理スレッドの実際の中身を組み込んでいきたいと思います。
関連する記事
⇒サービスプログラムの作り方について・その1⇒サービスプログラムの作り方について・その2
⇒サービスプログラムの作り方について・その4(メイン処理内で別のスレッドを呼出す)
コメント