|
|||||
<このサンプルの概要> スレッドを生成して開始/終了や一時停止/再開するサンプル(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 |