THREAD EM SEGUNDO PLANO

SASSAPOETA 29/10/2013 09:44:33
#430468
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.
MADMAX 29/10/2013 10:22:43
#430475
Ve se isso te ajuda .. creio que possa executar como show mesmo e depois pegar o resultado de modo assincrono .

Algo assim
SASSAPOETA 29/10/2013 12:56:06
#430488
Obrigado, mas não dá certo e quando eu abro uma caixa de mensagens?
OCELOT 29/10/2013 13:25:56
#430490
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.

SASSAPOETA 29/10/2013 13:57:29
#430494
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.
MADMAX 29/10/2013 14:02:45
#430496
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 ..
OCELOT 29/10/2013 14:47:43
#430499
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.
SASSAPOETA 30/10/2013 09:35:23
#430522
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?

GUIMORAES 30/10/2013 11:26:23
#430529
Tenta isto.

If InvokeRequired = True Then
BeginInvoke(New MethodInvoker(AddressOf exibeJanela))
End If

Private Sub exibeJanela()
frmJanela.ShowDialog()
End Sub
SASSAPOETA 30/10/2013 17:26:37
#430553
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.
MADMAX 01/11/2013 15:06:20
#430649
SASSAPOETA não necessita de showdialog se você olhou e entendeu o codigo pode ver que não chamo nada com showDialog.
Página 1 de 2 [11 registro(s)]
Faça seu login para responder