Ir para conteúdo
Fórum Script Brasil
  • 0

Guis/threads E Eventos Em Vb.net


Thiago Alencar

Pergunta

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)
no codigo do formulario faco:
AddHandler TestConn.E_CurrentOperation, AddressOf Me.CurrentStatus_Handler

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?

obrigado pela atencao!

Thiago.

Editado por Thiago Alencar
Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Ola Graymalkin!

setando CheckForIllegalCrossThreadCalls para False não tive mais InvalidOperationException! Pode explicar o que essa propriedade faz e por que é "True" por padrão?

Acho que não é muito seguro utilizar essa propriedade em false. O aplicativo lanca diferentes excessoes "randomicamente" agora de vez em quando. Voce costuma usa-la frequentemente? Tem problemas tambem?

obrigado!

Editado por Thiago Alencar
Link para o comentário
Compartilhar em outros sites

  • 0
Ola Graymalkin!

setando CheckForIllegalCrossThreadCalls para False não tive mais InvalidOperationException! Pode explicar o que essa propriedade faz e por que é "True" por padrão?

Acho que não é muito seguro utilizar essa propriedade em false. O aplicativo lanca diferentes excessoes "randomicamente" agora de vez em quando. Voce costuma usa-la frequentemente? Tem problemas tambem?

obrigado!

Ela é True por padrão justamente para evitar a utilização de um mesmo controle por dois ou mais threads ao mesmo tempo, o que pode levá-lo a um estado inválido. E provavelmente é por isso que você deve estar recebendo erros aleatóriamente. Eu só usei esta propriedade num projeto recente (só fui ter conhecimento dela a uma duas semanas atrás aproximadamente), e não tive problemas desse tipo. Mas, também no caso não havia o risco real de dois threads usarem o mesmo controle. Esse é o seu caso?

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0

Isso que imaginei..

Na verdade o problema não é de varios threads manipularem um mesmo controle, mas quando o controle deixa de existir (por exemplo ao fechar o form) e ainda há um processo de um evento ocorrendo.. o que fiz para "resolver" isso foi enlacar o codigo dentro de um try/catch so para que não ocorra nada (nenhuma interrupcao) quando houver uma excessao como esta.

Ate agora não estou tendo maiores problemas.

muito obrigado,

Thiago.

Link para o comentário
Compartilhar em outros sites

  • 0

Acontece que este é um form "secundario". Os threads são controlados por um outro form e não devem ser parados quando o form secundario deixa de ser exibido.

Mas esse CheckForIllegalCrossThreadCalls foi a unica salvacao mesmo.. caso contrario teria que re-estruturar todo o programa.

Se descobrir a forma mais "correta" de atingir o mesmo objetivo postamos ai!

Valeu mesmo Graymalkin!

abracos

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,2k
×
×
  • Criar Novo...