Usuário com melhor resposta
Alterar um controle na thread principal atraves de uma thread secundaria

Pergunta
-
Programo em vb.net e é o seguinte:
Tenho uma thread principal que eh o form inicial do programa, neste form tem um listbox e um botao.
Este botao chama uma thread q direciona para uma classe(a do codigo acima do post) q vamos chamar de thread1 e dentro dessa classe é criado uma outra thread q tbem direciona para outra classe(a classe Terminal) q vamos chamar de thread2.
entao dentro da classe da thread2 eu preciso adicionar um item ao listbox da thread principal, e a mesma coisa eu preciso fazer na thread1.
simplesmente se eu faço algo como:
frmMain.Listbox.itens.add("teste")
dentro de qquer thread secundaria nada acontece.
se eu instancio o formulario principal num modulo e depois chamo ele atraves do Sub Main e dentro das thread1 ou 2 eu tento adicionar um item ao listbox me da uma msg de erro falando que eu nao posso adicionar item q esta em outra thread q nao seja a atual.
Eu ja li varias paginas na net falando sobre multthreading e etc mas nao achei um exemplo pratico ou algo q realmente me esclareça como funciona o acesso a outras thread em execuçao e inclusive a thread principal do programa.
A estrutura seria assim:
frmMain (form com um Listbox)
|
-------------------------> Thread1(uma classe)
|
-------------------------------> Thread2(uma classe)
Operaçoes necessarias:
1► Na Thread1 adicionar um item ao Listbox(frmMain)
2► Na Thread2 adicionar um item ao Listbox(frmMain)
3► Na Thread2 alterar valores de variaveis na Thread1
Se alguem puder me exclarecer eu ficaria agradecido.
Abraços
Alexsandro Nunes
Respostas
-
Olá Alexsandro,
Os controles do formulário só devem ser alterados a partir da thread principal. Para isso, os formulários possuem os métodos Invoke (sincrono) e BeginInvoke (assincrono) que permitem você fazer algo como:
"Ei, formulário, execute esse trecho de código aqui, na thread onde você se encontra."
No seu exemplo:
Code Snippetprivate void MinhaThread()
{
// ...
// Processamento demorado
// ...
frmMain.Invoke((MethodInvoker)delegate
{
frmMain.Listbox.Items.Add("teste");
});
// ...
// Continuação...
// ...
}
Abraços,
Caio Proiete
Caio Proiete
http://www.caioproiete.com- Sugerido como Resposta C. Augusto Proiete [MVP]Moderator sábado, 4 de julho de 2009 00:32
- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 23 de julho de 2010 22:07
-
Olá,
Basta utilizar o conversor de C# para VB.NET e vice-versa:
http://labs.developerfusion.co.uk/
Abraços,
Caio Proiete
Caio Proiete
http://www.caioproiete.com- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 23 de julho de 2010 22:07
Todas as Respostas
-
Olá Alexsandro,
Os controles do formulário só devem ser alterados a partir da thread principal. Para isso, os formulários possuem os métodos Invoke (sincrono) e BeginInvoke (assincrono) que permitem você fazer algo como:
"Ei, formulário, execute esse trecho de código aqui, na thread onde você se encontra."
No seu exemplo:
Code Snippetprivate void MinhaThread()
{
// ...
// Processamento demorado
// ...
frmMain.Invoke((MethodInvoker)delegate
{
frmMain.Listbox.Items.Add("teste");
});
// ...
// Continuação...
// ...
}
Abraços,
Caio Proiete
Caio Proiete
http://www.caioproiete.com- Sugerido como Resposta C. Augusto Proiete [MVP]Moderator sábado, 4 de julho de 2009 00:32
- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 23 de julho de 2010 22:07
-
-
Olá,
Basta utilizar o conversor de C# para VB.NET e vice-versa:
http://labs.developerfusion.co.uk/
Abraços,
Caio Proiete
Caio Proiete
http://www.caioproiete.com- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 23 de julho de 2010 22:07