Vb2017 многопоточность: нажимайте кнопки наугад ...
Чтобы хорошо изучить "многопоточность", у меня есть три кнопки, два текстовых поля и поле с картинками на форме, причем каждая из трех делает совершенно разные вещи (добавляет, вычитает и показывает картинки).
В первый раз когда я попробовал эту программу я использовал Сабу:
Меня.CheckForIllegalCrossThreadCalls = Ложное Я думаю, вы знаете, что я так просто не оставлю.
Я мог бы нажать любую кнопку, и когда я захочу, соответствующая нить немедленно начиналась снова. Именно этого я и хочу.
Но эй, я понял, что это не тот способ, которым я должен программировать!
Итак, теперь я использую следующее:
If Label1.InvokeRequired Then Me.BeginInvoke(New UpdateLabel1Delegate(AddressOf UpdateLabel1Text), message) Else DoSomething End If End Sub
Три "нити" запускаются нажатием соответствующей кнопки. Отлично работает!
Я могу аккуратно нажимать кнопки, но мне нужно подождать, пока нить будет готова, а затем начать следующую нить. Я не могу нажать ни одну кнопку наугад и в любой момент перезапустить соответствующую нить.
Есть ли кто-то, кто может дать мне подсказку или конкретный намек, как это сделать? Надеюсь, с куском соответствующего кода. Я много искал в интернете, он должен быть там, но где?
Заранее спасибо,
Эрик
П. С. отредактировал код:
Imports System.Threading Public Class Form1 Dim Number1 As Integer Dim Number2 As Integer Dim Thread1 As System.Threading.Thread Dim Thread2 As System.Threading.Thread Dim Thread3 As System.Threading.Thread Private Delegate Sub UpdateLabel1Delegate(ByVal Number1 As Integer) Private Delegate Sub UpdateLabel2Delegate(ByVal Number2 As Integer) Private Delegate Sub UpdatePicturebox1Delegate() Private Delegate Sub Button1_Clickdelegate(sender As Object, e As EventArgs) Private Delegate Sub Button2_Clickdelegate(sender As Object, e As EventArgs) Private Delegate Sub Button3picturebox1delegate(sender As Object, e As EventArgs) Dim FirstTime1 As Boolean = True Dim FirstTime2 As Boolean = True Dim FirstTime3 As Boolean = True Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Thread1.Abort() If Button1.InvokeRequired Then Me.BeginInvoke(New Button1_Clickdelegate(AddressOf Button1_Click)) Else Thread1 = New System.Threading.Thread(AddressOf CountUp) Thread1.Start() T End If End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click If Button2.InvokeRequired Then Me.BeginInvoke(New Button2_Clickdelegate(AddressOf Button2_Click)) Else Thread2 = New System.Threading.Thread(AddressOf CountDown) Thread2.Start() End If End Sub Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click If PictureBox1.InvokeRequired Then Me.BeginInvoke(New Button3picturebox1delegate(AddressOf Button3_Click)) Else Thread3 = New System.Threading.Thread(AddressOf UpdatePicturebox1) Thread3.Start() End If End Sub Private Sub CountUp() Number1 = 0 Do Until Number1 = 1000 Number1 = Number1 + 1 UpdateLabel1Text(Number1) Loop End Sub 'CountUp Private Sub CountDown() Number2 = 1000 Do Until Number2 = 0 Number2 = Number2 - 1 UpdateLabel2Text(Number2) Loop End Sub 'CountDown Private Sub UpdateLabel1Text(ByVal Number1 As Integer) If Label1.InvokeRequired Then Me.BeginInvoke(New UpdateLabel1Delegate(AddressOf UpdateLabel1Text), Number1) Else Label1.Text = Number1 Me.Refresh() End If End Sub Private Sub UpdateLabel2Text(ByVal Number2 As Integer) If Label2.InvokeRequired Then Me.BeginInvoke(New UpdateLabel2Delegate(AddressOf UpdateLabel2Text), Number2) Else Label2.Text = Number2 Me.Refresh() End If End Sub Private Sub UpdatePicturebox1() Dim Aantal As Integer = 1000, x As Integer If PictureBox1.InvokeRequired Then Me.BeginInvoke(New UpdatePicturebox1Delegate(AddressOf UpdatePicturebox1)) Else For x = 1 To Aantal If PictureBox1.Visible = True Then PictureBox1.Visible = False 'Me.Refresh() Else PictureBox1.Visible = True Me.Refresh() End If Next 'x End If End Sub End Class
Что я уже пробовал:
Если Label1.Свойство Invokerequired Тогда
Me.BeginInvoke(New UpdateLabel1Delegate(AddressOf UpdateLabel1Text), сообщение)
Еще
Сделать
Конец, Если
0x01AA
Я удивлен, что вы вообще можете видеть какое-то реальное действие ваших нитей. Для пробы поставили Thread.Sleep(50)
во всех "нитях петли".