Estou com um problemao aqui relacionado a GUIs/Threads e eventos em vb.net.. quem tem boa nocao nessa area se puder me ajudar eu agradeco muito.
Preciso rodar processos como threads na aplicacao. Esses threads contem estados de execucao (por ex. iniciado, lendo, escrevendo,etc). Estes estados precisam ser exibidos no form.
Antes de mais nada, quero deixar claro os motivos pelo qual não uso delegates para controlar os componentes
do formulario pelo thread:
-Como não sei o numero de threads que terei de instanciar (no momento em que projeto o sistema), seria um
trabalho muito grande adaptar o codigo toda vez incluindo ou removendo os delegates.
-Haveria um aumento absurdo na quantidade/manutencao de codigo pois cada thread vai ter seu componente
especifico no form.
A ideia que tive para solucionar este problema, ao invés de criar milhares de delegates apontando para os labels
dos forms, foi a seguinte:
Instanciar e criar os threads (na classe do form principal). Estes threads contem eventos que serao "raised" (ou chamados) conforme seus estados mudam. Neste mesmo form principal, adiciono os respectivos event handlers pelo metodo "Addhandler". Por exemplo, se na minha classe do thread declarei:
Public Event E_CurrentOperation(ByVal op As Operation)
onde naturalmente o "CurrentStatus_Handler" é o metodo que contem o codigo que sera executado quando o
evento for detectado.
Fazendo um teste, coloquei um "MessageBox.Show("TESTE")" no CurrentStatus_Handler para ver o que aconteceria.
Para minha surpresa, funcionou perfeitamente (inclusive com os parametros). Minha decepcao foi quando alterei
o MessageBox.Show("TESTE") para Me.LblStatus.Text = "whatever", recebendo a excecao InvalidOperationException:
Invalid thread overall course of events: The access on the control element LblStateConn1 occurred from another thread as the thread, for which it was created.
Ou seja, não da pra alterar nada do formulario! Ai fiquei surpreso, porque poxa! agora que o evento já foi detectado (que normalmente seria a parte mais complicada) não consigo rodar nada que altere componentes do
form, no proprio codigo do form! isso parece um absurdo pra mim, mas vai ver e' porque os Guis não são "thread-safe".. vai saber?
deve haver alguma solucao para isto, alguém se propoe a dar uma sugestao?
Pergunta
Thiago Alencar
Estou com um problemao aqui relacionado a GUIs/Threads e eventos em vb.net.. quem tem boa nocao nessa area se puder me ajudar eu agradeco muito.
Preciso rodar processos como threads na aplicacao. Esses threads contem estados de execucao (por ex. iniciado, lendo, escrevendo,etc). Estes estados precisam ser exibidos no form.
Antes de mais nada, quero deixar claro os motivos pelo qual não uso delegates para controlar os componentes
do formulario pelo thread:
-Como não sei o numero de threads que terei de instanciar (no momento em que projeto o sistema), seria um
trabalho muito grande adaptar o codigo toda vez incluindo ou removendo os delegates.
-Haveria um aumento absurdo na quantidade/manutencao de codigo pois cada thread vai ter seu componente
especifico no form.
A ideia que tive para solucionar este problema, ao invés de criar milhares de delegates apontando para os labels
dos forms, foi a seguinte:
Instanciar e criar os threads (na classe do form principal). Estes threads contem eventos que serao "raised" (ou chamados) conforme seus estados mudam. Neste mesmo form principal, adiciono os respectivos event handlers pelo metodo "Addhandler". Por exemplo, se na minha classe do thread declarei:
no codigo do formulario faco:onde naturalmente o "CurrentStatus_Handler" é o metodo que contem o codigo que sera executado quando o
evento for detectado.
Fazendo um teste, coloquei um "MessageBox.Show("TESTE")" no CurrentStatus_Handler para ver o que aconteceria.
Para minha surpresa, funcionou perfeitamente (inclusive com os parametros). Minha decepcao foi quando alterei
o MessageBox.Show("TESTE") para Me.LblStatus.Text = "whatever", recebendo a excecao InvalidOperationException:
Ou seja, não da pra alterar nada do formulario! Ai fiquei surpreso, porque poxa! agora que o evento já foi detectado (que normalmente seria a parte mais complicada) não consigo rodar nada que altere componentes do
form, no proprio codigo do form! isso parece um absurdo pra mim, mas vai ver e' porque os Guis não são "thread-safe".. vai saber?
deve haver alguma solucao para isto, alguém se propoe a dar uma sugestao?
obrigado pela atencao!
Thiago.
Editado por Thiago AlencarLink para o comentário
Compartilhar em outros sites
6 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.