スレッド制御(C#/VB.NET)
2010年06月30日
スレッドの作成/開始/終了/停止/再開を制御するサンプル(ソース/コード)です。CPUにデュアルコアやクアッドコアを使用しているパソコンが多いですが、スレッド対応していないソフトはその恩恵をあまり受けません。時間の掛かる処理はスレッド処理するように心がけた方が良いと思います。
スレッドの停止/再開にSuspend()/Resume()を使用すると2005では旧形式であると叱られるので、停止中フラグ(suspend)を使用して実現しています。
BackgroundWorkerによるスレッドのサンプルはこちらです。
BackgroundWorkerスレッド(C#/VB.NET)
' -----------------------------------------------------------
' スレッドを制御するサンプル(VB.NET/VS2005)
Private thread1 As System.Threading.Thread
Private thread2 As System.Threading.Thread
Private suspend As Boolean
Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
' スレッド作成
thread1 = New System.Threading.Thread( _
New System.Threading.ThreadStart( _
AddressOf Thread_Proc1))
thread2 = New System.Threading.Thread( _
New System.Threading.ThreadStart( _
AddressOf Thread_Proc2))
' スレッド開始
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
' スレッド停止
suspend = True
End Sub
Private Sub Button4_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button4.Click
' スレッド再開
suspend = False
End Sub
' スレッド処理
Private Sub Thread_Proc1()
Try
Do
If suspend = False Then
System.Diagnostics.Debug.WriteLine( _
"スレッド1:" & DateTime.Now.ToString())
End If
System.Threading.Thread.Sleep(500)
Loop
Catch ex As System.Threading.ThreadAbortException
Return
End Try
End Sub
' スレッド処理
Private Sub Thread_Proc2()
Try
Do
If suspend = False Then
System.Diagnostics.Debug.WriteLine( _
"スレッド2:" & DateTime.Now.ToString())
End If
System.Threading.Thread.Sleep(1000)
Loop
Catch ex As System.Threading.ThreadAbortException
Return
End Try
End Sub
' -----------------------------------------------------------
// ----------------------------------------------------------
// スレッドを制御するサンプル(C#.NET/VS2005)
private System.Threading.Thread thread1;
private System.Threading.Thread thread2;
private Boolean suspend;
private void button1_Click(object sender, EventArgs e)
{
// スレッド作成
thread1 = new System.Threading.Thread(
new System.Threading.ThreadStart(
Thread_Proc1));
thread2 = new System.Threading.Thread(
new System.Threading.ThreadStart(
Thread_Proc2));
// スレッド開始
thread1.Start();
thread2.Start();
}
private void button2_Click(object sender, EventArgs e)
{
// スレッド終了
thread1.Abort();
thread2.Abort();
}
private void button3_Click(object sender, EventArgs e)
{
// スレッド停止
suspend = true;
}
private void button4_Click(object sender, EventArgs e)
{
// スレッド再開
suspend = false;
}
// スレッド処理
private void Thread_Proc1(){
try{
while (true)
{
if (suspend == false)
{
System.Diagnostics.Debug.WriteLine(
"スレッド1:" + DateTime.Now.ToString());
}
System.Threading.Thread.Sleep(500);
}
}catch( System.Threading.ThreadAbortException){
return;
}
}
// スレッド処理
private void Thread_Proc2()
{
try
{
while (true)
{
if (suspend == false)
{
System.Diagnostics.Debug.WriteLine(
"スレッド2:" + DateTime.Now.ToString());
}
System.Threading.Thread.Sleep(1000);
}
}
catch (System.Threading.ThreadAbortException)
{
return;
}
}
// ----------------------------------------------------------
コメント
仕様書作成係
読ませていただきました。
大変参考になりました。
これからも、良い情報の発信をしていだければと思います。
ありがとうございました。
仕様書作成係
http://www.hotdocument.net/