Member 11112814 Ответов: 1

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) во всех "нитях петли".

1 Ответов

Рейтинг:
2

OriginalGriff

Вызовы Invoke и CheckForIllegalCrossThreadCalls актуальны только при попытке получить доступ к элементу управления из потока, отличного от исходного потока пользовательского интерфейса: если вы получаете доступ к ним из созданного потока, то вам следует использовать Invoke, который перемещает код обратно в исходный поток пользовательского интерфейса. Это не имеет ничего общего с "потоками, начинающимися немедленно", и вызов не заменяет фактического создания потока!

Посмотрите на свой код (очевидно, мы его не видим): нажатие кнопки должно создать и запустить поток. В методе потока, вы можете использовать вызов, чтобы открыть ваши надписи / надписи / элемента управления PictureBox.


Member 11112814

Йой написал:"ваше нажатие кнопки должно создать и запустить поток". Вот в чем проблема!
Нажатие кнопки должно создать и запустить поток, и это действительно происходит, но не раньше, чем закончится предыдущий поток!

OriginalGriff

Итак, покажите нам код, который вы используете для создания и запуска потока.