NonSoft

スレッドの開始/終了と同期(排他制御)
のサンプル(VB.NET)


 サンプル(ソース/コード)
<このサンプルの概要>
スレッドを生成して開始/終了や一時停止/再開するサンプル(VB.NET)です。
2つのスレッドを開始して同期(排他制御)して動くようにしています。
排他制御にはSyncLock(C#ではlock)を使用しています。

このサンプルではスレッド処理として「デバッグ分を1秒毎に3回表示」する処理を繰り返す
ようにしています。

排他制御のSyncLock(C#ではlock)部分を削除すると、スレッド1とスレッド2のデバッグ分が
混ざって表示されますが、排他制御のSyncLock(C#ではlock)があるとスレッド1の処理が完了
した後にスレッド2の処理が開始されます。

また、このサンプルの一時停止/再開にはSuspend()とResume()を使用しています。
Suspend()とResume()は過去(旧形式)のメソッドで.NetFramework2.0では互換性のために
残っていますが、今後の.NetFrameworkのリリースで削除されるようです。

C#.NET版はこちらです。スレッドの開始/終了と同期(排他制御)のサンプル(C#.NET)

CPUにデュアルやクアッドのコアを使用していても、スレッド対応していないアプリはその恩恵を
最大限に受ける事は出来ません。出来るだけスレッド対応するように心がけたいものです。

★フォーム・クラス(Form1.vb)
Public Class Form1
    Private thread1 As System.Threading.Thread
    Private thread2 As System.Threading.Thread
    Private syncobj As New Object

    ' スレッド開始ボタン
    Private Sub Button1_Click( _
        ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button1.Click
        ' スレッド作成
        thread1 = New System.Threading.Thread(AddressOf Thread_Func1)
        thread2 = New System.Threading.Thread(AddressOf Thread_Func2)
        ' スレッド開始
        thread1.Start()
        thread2.Start()
    End Sub

    ' スレッド終了ボタン
    Private Sub Button2_Click( _
        ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button2.Click
        ' スレッド終了
        thread1.Abort()
        thread2.Abort()
    End Sub

    ' スレッド停止ボタン
    Private Sub Button3_Click( _
        ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button3.Click
        ' スレッド停止
        thread1.Suspend()   ' 旧形式(今後のリリースで削除されます)
        thread2.Suspend()   ' 旧形式(今後のリリースで削除されます)
    End Sub

    ' スレッド再開ボタン
    Private Sub Button4_Click( _
        ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button4.Click
        ' スレッド再開
        thread1.Resume()    ' 旧形式(今後のリリースで削除されます)
        thread2.Resume()    ' 旧形式(今後のリリースで削除されます)
    End Sub

    ' フォームクローズ
    Private Sub Form1_FormClosed( _
        ByVal sender As System.Object, _
        ByVal e As System.Windows.Forms.FormClosedEventArgs) _
        Handles MyBase.FormClosed
        ' スレッド終了
        thread1.Abort()
        thread2.Abort()
    End Sub

    ' スレッド関数
    Private Sub Thread_Func1()
        System.Diagnostics.Debug.WriteLine(" Thread1開始")
        Try
            Do
                SyncLock syncobj    ' 同期(排他制御)
                    System.Diagnostics.Debug.WriteLine( _
                        " Thread1-1:" & DateTime.Now.ToString())
                    System.Threading.Thread.Sleep(1000)

                    System.Diagnostics.Debug.WriteLine( _
                        " Thread1-2:" & DateTime.Now.ToString())
                    System.Threading.Thread.Sleep(1000)

                    System.Diagnostics.Debug.WriteLine( _
                        " Thread1-3:" & DateTime.Now.ToString())
                    System.Threading.Thread.Sleep(1000)
                End SyncLock
            Loop
        Catch ex As System.Threading.ThreadAbortException
            Return
        Finally
            System.Diagnostics.Debug.WriteLine(" Thread1終了")
        End Try
    End Sub

    ' スレッド関数
    Private Sub Thread_Func2()
        System.Diagnostics.Debug.WriteLine(" Thread2開始")
        Try
            Do
                SyncLock syncobj    ' 同期(排他制御)
                    System.Diagnostics.Debug.WriteLine( _
                        "*Thread2-1:" & DateTime.Now.ToString())
                    System.Threading.Thread.Sleep(1000)

                    System.Diagnostics.Debug.WriteLine( _
                        "*Thread2-2:" & DateTime.Now.ToString())
                    System.Threading.Thread.Sleep(1000)

                    System.Diagnostics.Debug.WriteLine( _
                        "*Thread2-3:" & DateTime.Now.ToString())
                    System.Threading.Thread.Sleep(1000)
                End SyncLock
            Loop
        Catch ex As System.Threading.ThreadAbortException
            Return
        Finally
            System.Diagnostics.Debug.WriteLine(" Thread2終了")
        End Try
    End Sub
End Class