Threadクラスでマルチスレッドをする
・同時に実行できるスレッドの数に制限がある
Threadのマルチスレッド
Start() スレッドの開始 Suspend() スレッドの一時停止 Resume() スレッドの再開 Join() スレッドの処理が終了するまで待つ Abort() スレッドの強制終了 ThreadState スレッドのステータスの取得
スレッド使用例
Private thisLock As New Object Private s As String = "" 「呼ぶ出されるスレッドプログラム」 Private Sub ThreadMain1() Dim i As Integer For i = 0 To 9999 SyncLock thisLock s = s + "A" End SyncLock Next System.Diagnostics.Debug.WriteLine(" Thread2:" & s.Length.ToString()) End Sub ------------------------------------------------------------------------------ 「呼び出し側のプログラム」 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim thread1 As System.Threading.Thread = New System.Threading.Thread(AddressOf ThreadMain1) thread1.Start() thread1.Join() End Sub
スレッド側でメインのコントロールを更新する
別スレッドからコントロールを操作する場合にはInvokeメソッドを使用します。Invokeメソッドを使うと、コントロールに対する操作をメイン・スレッドで実行させることができる。
Invokeメソッドを使う必要があるかどうかをチェックするためのInvokeRequiredプロパティがあります。このプロパティは、それを呼び出したスレッドがメイン・スレッドかどうかを調べ、trueあるいはfalseを返します。
Private thisLock As New Object Private s As String = "" 'コントロールを扱うためのデリゲート宣言 Delegate Sub delegate_ProgressBarValue(ByVal value As Integer) 'デリゲート宣言をデータ型とした変数を作成 Private ProgressBarValue As New delegate_ProgressBarValue(AddressOf ProgressBar1Value) 'プログレスバー更新処理 Sub UpdateProgressBar1(val As Integer) If InvokeRequired Then Dim callback As New delegate_ProgressBarValue(AddressOf UpdateProgressBar1) Invoke(callback, val) Return End If ProgressBar1.Value = val End Sub Private Sub ThreadMain1() Dim i As Integer For i = 0 To 999 UpdateProgressBar1(i) SyncLock thisLock s = s + "A" End SyncLock Next System.Diagnostics.Debug.WriteLine(" Thread1:" & s.Length.ToString()) End Sub -------------------------------------------------------------------------------------- [呼び出し側プログラム] Dim Thread1 As System.Threading.Thread = Nothing Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click If Not Thread1 Is Nothing Then ' スレッドが停止状態でない場合は終了 If Thread1.ThreadState <> System.Threading.ThreadState.Stopped Then Exit Sub End If End If ' スレッド開始 Thread1 = New Threading.Thread(AddressOf ThreadMain1) Thread1.IsBackground = True Thread1.Start() ' Thread1.Join() End Sub 'Joinでスレッド終了を待たせると、メインコントロール更新で死にますので注意 Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed If Not Thread1 Is Nothing Then ' スレッドを強制終了させる Thread1.Abort() ' メインスレッドに結合する Thread1.Join() End If End Sub