Ir para o conteúdo

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