Изменить значение ProgressBar из потока - Visual Basic .NET

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Необходима ваша помощь в правильной организации потоков. Есть основная форма, из которой создается новый поток. В запущенном потоке

Th1

, запускается процедура

Copy_2Flash

для выполнение некоторых действий и передачи параметров процедуре

CopyFile

, находящейся в модуле

Inquiries

. Далее происходит процедура копирования и по идее запуск процедуры

PB

в новом потоке должен менять значение прогрессбара и отображать это на основной форме. Но процесс встает на

If WIN2USB.InvokeRequired Then

, а точнее проскакивает этот момент.

Решение задачи: «Изменить значение ProgressBar из потока»

textual
Листинг программы
Module Module1 
    Public frm As Form1 ' общий объект класса form1(еще не реализованный)
End Module
 
Public Class Form1
    Public cl As New Class1
    Public th1 As Threading.Thread
 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        th1 = New Threading.Thread(AddressOf cl.emit1)
        th1.SetApartmentState(Threading.ApartmentState.STA)
        th1.IsBackground = True
        th1.Start()
 
    End Sub
 
    Sub pb()
        Me.ProgressBar1.Value += 1
        If Me.ProgressBar1.Value >= 100 Then
            Me.ProgressBar1.Value = 0
        End If
    End Sub
 
    Sub New()
 
        ' Этот вызов является обязательным для конструктора.
        InitializeComponent()
 
        ' Добавьте все инициализирующие действия после вызова InitializeComponent().
 
        frm = Me ' после инициализации формы присваиваем общему объекту ссылку на реализованный объект формы
    End Sub
 
 
End Class
Public Class Class1
    Sub emit1()
        For i As Integer = 0 To 99
            Call emit2()
        Next
    End Sub
 
    Sub emit2()
 
        Threading.Thread.Sleep(200)
        ' Do
        If frm.ProgressBar1.InvokeRequired Then ' все запросы делаем через общий объект
            frm.ProgressBar1.Invoke(New Threading.ThreadStart(AddressOf frm.pb)) 
            ' Exit Do
        End If
        ' Loop
    End Sub
 
End Class

Оцени полезность:

10   голосов , оценка 4.3 из 5
Похожие ответы