Изменить значение 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