.NET 3.x Приостановить/продолжить работу потока - Visual Basic .NET
Формулировка задачи:
Доброго! не удается приостановить работу потока (resume/suspend - не работает)
поток работает с внешним приложением с некоторыми непредсказуемыми случаями и что бы не начинать по новой.
все что удалось найти (не работает - поток продолжает работу)https://msdn.microsoft.com/en-us/lib...aithandle.aspxhttps://msdn.microsoft.com/en-us/lib...e.waitone.aspx
Листинг программы
- Imports System.Threading
- Public Class Form1
- Dim th1 As New Thread(AddressOf ThreadProc)
- Dim paused As Int16 = 0
- Private wh As ManualResetEvent = New ManualResetEvent(True)
- 'Private wh As EventWaitHandle = New AutoResetEvent(True)
- 'Private wh As EventWaitHandle = New EventWaitHandle(False, EventResetMode.ManualReset)
- Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
- th1.Start()
- End Sub
- Private Sub ThreadProc()
- wh.WaitOne()
- While True
- MsgBox("")
- End While
- End Sub
- End Class
- '------------------приостановить/возобновить работу потока-----------------------------------
- Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
- If paused = 0 Then
- Button5.ForeColor = Color.Red
- paused = paused + 1
- wh.Reset()
- Else
- Button5.ForeColor = Color.Black
- paused = paused - 1
- wh.Set()
- End If
- End Sub
сделал так но цикл выполняется полностью... и далее начинается с начало
Листинг программы
- Imports System.Threading
- Public Class Form1
- Dim th1 As New Thread(AddressOf ThreadProc)
- Dim paused As Int16 = 0
- Dim manualEvent As New ManualResetEvent(True)
- '------------------приостановить/возобновить работу потока-----------------------------------
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- If paused = 0 Then
- Button1.ForeColor = Color.Red
- paused = paused + 1
- manualEvent.Reset()
- Else
- Button1.ForeColor = Color.Black
- paused = paused - 1
- manualEvent.[Set]()
- End If
- End Sub
- Private Sub ThreadProc(manualEvent As Object)
- Dim ev As ManualResetEvent = DirectCast(manualEvent, ManualResetEvent)
- While ev.WaitOne()
- MsgBox("1")
- Thread.Sleep(2000)
- MsgBox("2")
- Thread.Sleep(2000)
- MsgBox("3")
- End While
- End Sub
- Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
- th1.Start(manualEvent)
- End Sub
- End Class
Решение задачи: «.NET 3.x Приостановить/продолжить работу потока»
textual
Листинг программы
- Private Sub ThreadProc(manualEvent As Object)
- 'play / pause
- Dim ev As ManualResetEvent = DirectCast(manualEvent, ManualResetEvent)
- While ev.WaitOne()
- MsgBox("1")
- Thread.Sleep(2000)
- If ev.WaitOne = False Then Exit Sub
- MsgBox("2")
- Thread.Sleep(2000)
- If ev.WaitOne = False Then Exit Sub
- MsgBox("3")
- Thread.Sleep(2000)
- End While
- End Sub
- Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
- 'start and check status
- If th1.ThreadState = ThreadState.Running Or th1.ThreadState = ThreadState.WaitSleepJoin Then
- Exit Sub
- Else
- th1.Start(manualEvent)
- End If
- End Sub
- Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
- 'stop and exit
- th1.Abort()
- Application.Exit()
- End Sub
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д