THREAD EM SEGUNDO PLANO
Bom dia,
Estou com o seguinte problema:
Tenho uma thread em segundo plano em minha aplicação.
Esta thread executa um pooling em um máquina de estados e se comunica com equipamentos.
Ela retorna informações de acessos e de conectividade através de eventos e exibo na tela com this.Invoke e delegate.
Isto tudo funciona muito bem, mas existe um processo que ocorre as vezes não sempre.
Quando abro uma tela qualquer com um showDialog enquando esta tela estiver aberta o meu pooling trava simplesmente para e só volta quando eu fecho a tela aberta com showDialog.
Existe alguma maneira de contornar esta situação, porque eu preciso abrir as telas com showDialog para retornar a informação para a tela anterior, isto é um padrão dos sistemas desenvolvidos aqui. Mas eu não posso deixar que o meu pooling pare.
Agradeço qualquer sugestão e obrigado a todos.
Estou com o seguinte problema:
Tenho uma thread em segundo plano em minha aplicação.
Esta thread executa um pooling em um máquina de estados e se comunica com equipamentos.
Ela retorna informações de acessos e de conectividade através de eventos e exibo na tela com this.Invoke e delegate.
Isto tudo funciona muito bem, mas existe um processo que ocorre as vezes não sempre.
Quando abro uma tela qualquer com um showDialog enquando esta tela estiver aberta o meu pooling trava simplesmente para e só volta quando eu fecho a tela aberta com showDialog.
Existe alguma maneira de contornar esta situação, porque eu preciso abrir as telas com showDialog para retornar a informação para a tela anterior, isto é um padrão dos sistemas desenvolvidos aqui. Mas eu não posso deixar que o meu pooling pare.
Agradeço qualquer sugestão e obrigado a todos.
Ve se isso te ajuda .. creio que possa executar como show mesmo e depois pegar o resultado de modo assincrono .
Algo assim
Algo assim
Obrigado, mas não dá certo e quando eu abro uma caixa de mensagens?
Fiz testes aqui e só consegui travar de uma forma, que seria a thread chamar o Invoke e a delegate que foi passada para o Invoke chamar um form com o ShowDialog.
Se for isso o que está acontecendo então é o esperado, já que o ShowDialog não retorna enquanto o form não for fechado e o Invoke fica esperando a delegate terminar para continuar.
O que você pode fazer para contornar isso, caso você não precise esperar o retorno do Invoke para continuar é usar o BeginInvoke, pois ele é assÃncrono, não vai esperar a delegate terminar para continuar executando, porém neste caso você deve tomar cuidado pois pode acontecer de você abrir mais de um form com o ShowDialog por cima do outro.
Se for isso o que está acontecendo então é o esperado, já que o ShowDialog não retorna enquanto o form não for fechado e o Invoke fica esperando a delegate terminar para continuar.
O que você pode fazer para contornar isso, caso você não precise esperar o retorno do Invoke para continuar é usar o BeginInvoke, pois ele é assÃncrono, não vai esperar a delegate terminar para continuar executando, porém neste caso você deve tomar cuidado pois pode acontecer de você abrir mais de um form com o ShowDialog por cima do outro.
Estão acho que vc não entendeu meu cenário.
Já tentei trabalhar com o beginInvoke, mas tb gera o problema, detalhe não trava a todo instante, só trava de vez enquando.
tenho uma thread em segundo plano está thread possui um looping que executa comunicação com equipamentos e em alguns momentos envia eventos para um form que lê estes eventos e através de um delegado ele exibe na tela seja com invoke ou beginInvoke. Alguns processos na comunicação com estes equipamentos são mais demorados parando o meu looping em segundo plano, até ai tudo bem, porém tenho junto a isto meu sistema aonde faço cadastros e as vezes quando abro um showDialog para fazer o cadastro ou simplesmente quando exibo uma MessageBox percebo que o looping em segundo plano para e só volta quando fecho a tela aberta.
Já tentei trabalhar com o beginInvoke, mas tb gera o problema, detalhe não trava a todo instante, só trava de vez enquando.
tenho uma thread em segundo plano está thread possui um looping que executa comunicação com equipamentos e em alguns momentos envia eventos para um form que lê estes eventos e através de um delegado ele exibe na tela seja com invoke ou beginInvoke. Alguns processos na comunicação com estes equipamentos são mais demorados parando o meu looping em segundo plano, até ai tudo bem, porém tenho junto a isto meu sistema aonde faço cadastros e as vezes quando abro um showDialog para fazer o cadastro ou simplesmente quando exibo uma MessageBox percebo que o looping em segundo plano para e só volta quando fecho a tela aberta.
SASSAPOETA a saida seria você criar sua propria MessageBox usando mais ou menos o consceito que passei e bem provavel que não vai travar nada ..
Se é intermitente a coisa fica mais difÃcil, você provavelmente tem um deadlock e eles são bem complicados de se resolver.
O máximo que posso dizer é que você vai ter que examinar o call stack de cada thread quando o deadlock acontecer para ver o que elas estão fazendo que poderia causar este problema.
Eu diria para quando ocorrer isso você deve ir no menu Debug\Break All e então em Debug\Windows\Threads para listar todas as threads em execução, então dando dois cliques nelas você muda a ativa no debugger e pode olhar o call stack (menu Debug\Windows\Call Stack) dela.
Pode ser que você tenha que ir nas opções do visual studio e na parte Debugging desativar a opção [Ô]Enable Just My Code[Ô] para mostrar tudo realmente que está sendo executado.
De resto não tem muito acho o que dizer, se for um deadlock então é algo totalmente dependente do seu código.
O máximo que posso dizer é que você vai ter que examinar o call stack de cada thread quando o deadlock acontecer para ver o que elas estão fazendo que poderia causar este problema.
Eu diria para quando ocorrer isso você deve ir no menu Debug\Break All e então em Debug\Windows\Threads para listar todas as threads em execução, então dando dois cliques nelas você muda a ativa no debugger e pode olhar o call stack (menu Debug\Windows\Call Stack) dela.
Pode ser que você tenha que ir nas opções do visual studio e na parte Debugging desativar a opção [Ô]Enable Just My Code[Ô] para mostrar tudo realmente que está sendo executado.
De resto não tem muito acho o que dizer, se for um deadlock então é algo totalmente dependente do seu código.
Valeu MADMAX, mas de showDialog, o pessoal aqui não me permite fazer, a não ser que conseguisse um bloqueio de telas em cascata.
Então OCELOT, eu vi o que vc disse e não compreendi muito bem as threads apareceram muitas e todas relacionadas a forms.
Sei em qual linha do meu código tanto no momento em que ele trava na thread em segundo plano, quanto no momento do meu ShowDialog que segura a thread. No caso do Call Stack me mostra somente as threads relacionadas ao showDialog que segurou. Bom tentei criar o semáforo dando um WaiOn justamente antes desta linha em segundo plano que trava quando abro o showDialog, mas ai a minha thread segundaria parou , será que você tem alguma outra dica?
Então OCELOT, eu vi o que vc disse e não compreendi muito bem as threads apareceram muitas e todas relacionadas a forms.
Sei em qual linha do meu código tanto no momento em que ele trava na thread em segundo plano, quanto no momento do meu ShowDialog que segura a thread. No caso do Call Stack me mostra somente as threads relacionadas ao showDialog que segurou. Bom tentei criar o semáforo dando um WaiOn justamente antes desta linha em segundo plano que trava quando abro o showDialog, mas ai a minha thread segundaria parou , será que você tem alguma outra dica?
Tenta isto.
If InvokeRequired = True Then
BeginInvoke(New MethodInvoker(AddressOf exibeJanela))
End If
Private Sub exibeJanela()
frmJanela.ShowDialog()
End Sub
If InvokeRequired = True Then
BeginInvoke(New MethodInvoker(AddressOf exibeJanela))
End If
Private Sub exibeJanela()
frmJanela.ShowDialog()
End Sub
Valeu, mas InvokeRequired é usado quando vc está em uma thread de segundo plano e quer exibir algo na thread principal e não é meu caso, o shoDialog está na thread principal.
SASSAPOETA não necessita de showdialog se você olhou e entendeu o codigo pode ver que não chamo nada com showDialog.
Faça seu login para responder