Como aceder a um controlo através de outro Thread
Quem já utilizou multi-threading de certeza que já se deparou com este problema, este artigo mostra como correr um ciclo através de outro thread e colocar os valores numa ListBox
que está num formulário na thread principal.
Para isso vamos precisar de um Delegate
Private Delegate Sub AdicionarItemsDelegate(ByVal Texto As String)
E também de um procedimento que irá inserir os itens na ListBox
:
Private Sub AdicionarItems(ByVal Texto As String)
'Adiciona o item à listbox
ListBox1.Items.Add(Texto)
'Posiciona o cursor no ultimo registo
ListBox1.SelectedIndex = ListBox1.Items.Count - 1
End Sub
Dentro do evento DoWork
do BackgroudWorker
colocamos o nosso ciclo:
Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
For i = 1 To 100
'Chama o Delegate
ListBox1.Invoke(New AdicionarItemsDelegate(AddressOf AdicionarItems), String.Format("Item {0} de {1}", i, 100))
'Atrasa o processo
Threading.Thread.Sleep(50)
Next
End Sub
Finalmente só falta iniciar o processo:
Private Sub BtnIniciar_Click(sender As System.Object, e As System.EventArgs) Handles BtnIniciar.Click
'Inicia processo
BackgroundWorker1.RunWorkerAsync()
End Sub