次の方法で共有


スレッドの作成と実行方法について

Cc440899.download(ja-jp,MSDN.10).gif サンプル コードのダウンロード (vbmigtips_Thread.exe, 94.7 KB)

Visual Basic 6.0 では、スレッドをサポートしていませんでした。一方、Visual Basic .NET では、スレッドがサポートされたことで、より効率的なアプリケーションを作成することができます。スレッドの作成および、制御するクラスとして、System.Threading.Thread クラスが用意されています。そこで今回は、スレッドを作成して実行する方法とスレッドの実行を中断、再開する方法について紹介します。今回は、ProgressBar コントロールを使用して、スレッドの実行状況を表示します (図1)。

 Cc440899.Thread_fig01(ja-jp,MSDN.10).gif
 図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)。

 Cc440899.Thread_fig02(ja-jp,MSDN.10).gif
 図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)。

 Cc440899.Thread_fig03(ja-jp,MSDN.10).gif
 図3

スレッドの実行が中断している状態 (図3) で、[再開]ボタンを選択すると、スレッドの実行が再開されます (図4)。

 Cc440899.Thread_fig04(ja-jp,MSDN.10).gif
 図4