|
分類:[VB.NET/VB2005 以降]
フォームにボタンを作り別スレッドで時刻をカウントする処理を実行しています。
@のプログラムではボタンを押すとスレッドが実行され再度ボタンを押すとスレッドが停止されます。
Aのプログラムではボタンを押すとスレッドが実行されますが再度ボタンを押してもスレッドが停止されず、時間がカウントされ続けます。
同じAbort 処理を通過しているのですが、Aのプログラムではなぜスレッドが停止しないのかわからないのですが、 どなたかお分かりになる方教えていただけないでしょうか?
また、Aのプログラムでスレッドを停止する方法はどのようにすればよいのでしょうか?
【@のプログラム】 Public Class Form1 Private thread02 As System.Threading.Thread
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If TextBox2.Text = "" Then
' スレッド作成 thread02 = New System.Threading.Thread(AddressOf Thread_Func2)
' スレッド開始 thread02.Start() TextBox2.Text = "スレッド実行中" ElseIf TextBox2.Text = "スレッド実行中" Then TextBox2.Text = "" ' スレッド終了 thread02.Abort()
End If
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
【Aのプログラム】
Public Class Form1 Dim thread02 As System.Threading.Thread
Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
Dim dgv As DataGridView = CType(sender, DataGridView) '"Button"列ならば、ボタンがクリックされた
If dgv.Columns(e.ColumnIndex).Name = "Button" Then
Select Case DataGridView1.CurrentRow.Cells(0).Value Case "2" thread02 = New System.Threading.Thread(AddressOf Thread_Func2)
Case 3
Case 4
End Select
If DataGridView1.CurrentRow.Cells(5).Value = "スレッド実行中" Then DataGridView1.CurrentRow.Cells(5).Value = ""
Select Case DataGridView1.CurrentRow.Cells(0).Value
Case "2"
thread02.Abort()
Case "3"
Case "4"
End Select
ElseIf DataGridView1.CurrentRow.Cells(5).Value = "" Then
DataGridView1.CurrentRow.Cells(5).Value = "スレッド実行中"
Select Case DataGridView1.CurrentRow.Cells(0).Value Case "2" thread02.Start()
Case 3
Case 4 End Select
End If End If
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
【Aのプログラム】
Public Class Form1 Dim thread02 As System.Threading.Thread
Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
Dim dgv As DataGridView = CType(sender, DataGridView) '"Button"列ならば、ボタンがクリックされた
If dgv.Columns(e.ColumnIndex).Name = "Button" Then
Select Case DataGridView1.CurrentRow.Cells(0).Value Case "2" thread02 = New System.Threading.Thread(AddressOf Thread_Func2)
Case 3
Case 4
End Select
If DataGridView1.CurrentRow.Cells(5).Value = "スレッド実行中" Then DataGridView1.CurrentRow.Cells(5).Value = ""
Select Case DataGridView1.CurrentRow.Cells(0).Value
Case "2"
thread02.Abort()
Case "3"
Case "4"
End Select
ElseIf DataGridView1.CurrentRow.Cells(5).Value = "" Then
DataGridView1.CurrentRow.Cells(5).Value = "スレッド実行中"
Select Case DataGridView1.CurrentRow.Cells(0).Value Case "2" thread02.Start()
Case 3
Case 4 End Select
End If End If
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
|