Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ZecaLoteiro

Thread, Timer, Delegate?

Recommended Posts

Boa tarde,

 

Tenho uma aplicação de automação, rodando, porém preciso criar um TIMER para identificar erros na execução da automação... caso em 5 minutos não conclua o ciclo de automação, reinicie o processo.

 

Preciso fazer algo do tipo:

 

Definir timer para chamar a função restartaProcesso()

Enquanto 1=1

iniciaTimer

função de Automação

Fim Enquanto

 

 

function restartaProcesso()

Mata a função e reinicia o loop

end Function

 

Alguém poderia me ajudar por onde começar os estudos? Consigo resolver isso só com Thread?

Teria algum exemplo?

 

Desde já obrigado.

 

Att,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso é bem simples, o que você precisa fazer é adicionar a função de verificação dentro do evento Tick do timer, utilize uma variável global para a função de automação, ou então utilize um processo separado(Faça um outro programa para a função de automação) e depois chame o [inline]System.Diagnostics.Process.Start("funçãoautomação.exe")[/inline] Depois para finalizar o processo e reabrí-lo você pode usar:

 

VB.net

 

  For Each proc As System.Diagnostics.Process In System.Diagnostics.Process.GetProcesses
            If proc.ProcessName.Equals("funçãoautomação.exe") Then
                proc.Kill()
            End If
        Next

 

C#

 


foreach(System.Diagnostics.Process myProc in System.Diagnostics.Process.GetProcesses()) { 

if (myProc.ProcessName == "funçãoautomação.exe") { 

myProc.Kill(); 

} 

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

boa, vou implementar...

 

:)

 

Estava com outra visão... uhu, vou fazer o timer e no tick, vou chamar um programa externo para reinicar o processo...

;) Thanx.

Compartilhar este post


Link para o post
Compartilhar em outros sites

boa, vou implementar...

 

:)

 

Estava com outra visão... uhu, vou fazer o timer e no tick, vou chamar um programa externo para reinicar o processo...

;) Thanx.

Me deparei com um grande problema...

 

No meio do meu processo de automação, utilizo muito Thread.sleep(), não sei se é isso, mas isso faz com que meu timer ticker não funcione.....

 

Se eu comento todo o conteúdo da automação, funciona :S

 

Ha alguma forma de solucionar isso? Talvez colocando o timer em outra thread? Como posso fazer isso???

 

Muito obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum, então você vai precisar utilizar o BackgroundWorker, ele basicamente joga o que for para outra thread, então você pega o timer que você já tem e cria um background worker, jogue no evento DoWork aquilo que o timer estava fazendo, porém o grande problema de usar o BgW é que ele não pode acessar componentes do seu form enquanto ele estiver no evento DoWork, então sempre que você tiver que acessar qualquer componente você vai precisar jogar para o evento RunWorkerCompleted, por exemplo, se você tiver que buscar algum texto ou algo do tipo certifique-se de que está fazendo no DoWork e depois jogue tudo para uma variável global, e ai no evento RunWorkerCompleted você pode resgatar essa variável global e jogar nos componentes normalmente.

 

Para chamar o evento DoWork basta colocar no seu timer:

 

If Not bg.IsBusy Then


bg.RunWorkerAsync()


End If

Mas tenha em mente que o tempo que seu bgw levará para executar a thread deve ser o tempo de intervalo entre os ticks, então se seu BgW levar 5 segundos para executar a thread, define o tick para 6000ms ou 5500ms.

 

Obs: O bgw consome uma quantidade absurda de RAM se ele precisar ser rodado por muitas vezes seguidas, em compensação o seu programa ficará rapido ao rodar e não irá travar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.