スレッドの作成と実行方法について
サンプル コードのダウンロード (vbmigtips_Thread.exe, 94.7 KB)
Visual Basic 6.0 では、スレッドをサポートしていませんでした。一方、Visual Basic .NET では、スレッドがサポートされたことで、より効率的なアプリケーションを作成することができます。スレッドの作成および、制御するクラスとして、System.Threading.Thread クラスが用意されています。そこで今回は、スレッドを作成して実行する方法とスレッドの実行を中断、再開する方法について紹介します。今回は、ProgressBar コントロールを使用して、スレッドの実行状況を表示します (図1)。
図1
まず、スレッドを作成し、起動する方法について紹介します。実装コードは以下のとおりです。
Private objThread As System.Threading.Thread = New System.Threading.Thread
(New System.Threading.ThreadStart(AddressOf Start))
Private Sub butStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles butStart.Click
If objThread.ThreadState = System.Threading.ThreadState.Stopped Then
objThread = New System.Threading.Thread(AddressOf Start)
End If
With objThread
.IsBackground = True
objThread.Start()
End With
End Sub
Private Sub Start()
butStart.Enabled = False
butStop.Enabled = True
butResume.Enabled = False
With ProgressBar1
.Value = 0
While .Value < .Maximum
System.Threading.Thread.Sleep(500)
.Value += 5
End While
End With
butStart.Enabled = True
butStop.Enabled = False
butResume.Enabled = False
End Sub
|
リスト1
リスト1 の「Private Sub butStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butStart.Click ... End Sub」では、スレッドを作成し、実行します。「If objThread.ThreadState = System.Threading.ThreadState.Stopped Then」で、スレッドの現在の状態を判別し、スレッドが停止している場合、「objThread = New System.Threading.Thread(AddressOf Start)」で Start メソッドをスレッドとして作成します。「objThread.IsBackground = True」で作成したスレッドをバッググラウンド スレッドに設定し、「objThread.Start()」でスレッドを実行します。
リスト1 の「Private Sub Start() ... End Sub」では スレッドで実行される処理のプロシージャを宣言します。今回、Start メソッドでは、ProgressBar コントロールを使用して、処理の進行状況を表します。「.Value = 0」で ProgressBar の現在位置を「0」に設定します。「While .Value < .Maximum ... End While」ではスレッドを一時中断し、進行状況を表す、ProgressBar の四角形の表示を一定量ずつ増やしていきます。「System.Threading.Thread.Sleep(500)」で 500 ミリ秒間スレッドを一時中断します。
これらを実装し、図1 の[起動]ボタンを選択すると、スレッドが作成され、実行します。スレッドが実行中、ProgressBar に進歩状況が表示されます (図2)。
図2
続いて、リスト1 で作成、実行中スレッドの中断と、中断されたスレッドの再開を実装します。実装コードは以下のとおりです。
Private Sub butStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles butStop.Click
objThread.Suspend()
butStop.Enabled = False
butResume.Enabled = True
End Sub
Private Sub butResume_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles butResume.Click
objThread.Resume()
butStop.Enabled = True
butResume.Enabled = False
End Sub
|
リスト2
上記 (リスト2) の「objThread.Suspend()」でスレッドの実行を中断し、「objThread.Resume()」で中断されているスレッドの実行を再開します。上記を実装し、[起動]ボタンを選択後 (図2)、スレッドが終了する前に、[停止]ボタンを選択します。すると、スレッドの実行が中断し、プログレス バーの表記も停止します (図3)。
図3
スレッドの実行が中断している状態 (図3) で、[再開]ボタンを選択すると、スレッドの実行が再開されます (図4)。
図4