C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: VB2013スレッドの停止に関して


(過去ログ 126 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■74955 / inTopicNo.1)  VB2013スレッドの停止に関して
  
□投稿者/ anonymousdiary (1回)-(2015/02/13(Fri) 13:08:33)

分類:[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



引用返信 編集キー/
■74957 / inTopicNo.2)  Re[1]: VB2013スレッドの停止に関して
□投稿者/ ななしん (2回)-(2015/02/13(Fri) 15:18:21)
2回目にクリックした時、
thread02 = New System.Threading.Thread(AddressOf Thread_Func2)
で新しいスレッドを作成し、それに対してAbortを実行していて、現在実行中の
スレッドには何もしていない状態になっています。

スレッドを実行している場合、Abortしてから次のスレッドを作成すればいいです。


引用返信 編集キー/
■74959 / inTopicNo.3)  Re[2]: VB2013スレッドの停止に関して
□投稿者/ anonymousdiary (2回)-(2015/02/13(Fri) 16:27:54)
ななしん様
ご返答大変ありがとうございます。
さっそく2回目の処理にAbortを追加してみたいと思います。

追加の疑問で申し訳ないのですが、私はthread02.start()を実行していないので
時刻のカウントはスタートしないと考えていました。
実際@のプログラムでは2回目にクリックしたときに時刻のカウントが実行されないのですが、
プログラム@とプログラムAの違いが判らないのですが教えていただけないでしょうか?

引用返信 編集キー/
■74960 / inTopicNo.4)  Re[3]: VB2013スレッドの停止に関して
□投稿者/ みい (15回)-(2015/02/13(Fri) 18:02:48)
No74959 (anonymousdiary さん) に返信
> ななしん様
> ご返答大変ありがとうございます。
> さっそく2回目の処理にAbortを追加してみたいと思います。
>
> 追加の疑問で申し訳ないのですが、私はthread02.start()を実行していないので
> 時刻のカウントはスタートしないと考えていました。
2回目でスタートしているのではなく、1回目のthread02が止まっていない状態です。

> 実際@のプログラムでは2回目にクリックしたときに時刻のカウントが実行されないのですが、
> プログラム@とプログラムAの違いが判らないのですが教えていただけないでしょうか?
1はTextBox2.Textの文字列で判断
→2回目のクリックではスレッド作成を通らない

2はDataGridView1.CurrentRow.Cells(0).Valueでスレッド生成を判断しているが、
スレッド実行有無処理はDataGridView1.CurrentRow.Cells(5).Valueで判断
→DataGridView1.CurrentRow.Cells(5).Valueの文字列にかかわらず新しく
スレッドが生成される。新しいスレッドに対してabortが呼び出されるため
1回目に生成されたスレッドに対してabortが呼ばれない


引用返信 編集キー/
■74961 / inTopicNo.5)  Re[4]: VB2013スレッドの停止に関して
□投稿者/ anonymousdiary (3回)-(2015/02/13(Fri) 18:07:14)
みい様
ご回答ありがとうございます。
大変理解しやすい説明をしてくださりありがとうございます。
私でも理解ができました。

ななしん様、みい様
本当にありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -