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