最終更新日 2005 年 7 月 14 日
サンプル
コードのダウンロード (vbmigtips_Thread.exe, 94.7 KB)
Visual Basic 6.0
では、スレッドをサポートしていませんでした。一方、Visual Basic .NET
では、スレッドがサポートされたことで、より効率的なアプリケーションを作成することができます。スレッドの作成および、制御するクラスとして、System.Threading.Thread
クラスが用意されています。そこで今回は、スレッドを作成して実行する方法とスレッドの実行を中断、再開する方法について紹介します。今回は、ProgressBar
コントロールを使用して、スレッドの実行状況を表示します (図1)。
.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)。
.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)。
.gif)
図3
スレッドの実行が中断している状態 (図3)
で、[再開]ボタンを選択すると、スレッドの実行が再開されます (図4)。
.gif)
図4