Fórum Como e quando terminar uma thread? #350871
20/12/2007
0
Estou criando uma thread no show do meu form principal:
Backup_NPS := TNPS_FTP.Criar(´Entrada´);
No construtor da thread utilizo uma checagem pois ela é chamada na entrada, execução e saida do sistema e cada situação envolve um procedimento diferente, por isso uso o parametro.
Agora vejam...
Como e onde devo dar o comando de Terminate para finalizar essa thread da memoria.
Se coloco. backup_NPs.terminate logo abaixo da linha de criação, a thread não executa o processo que preciso, pois pelo que está dando a entender, estou terminando ela antes mesmo que ela processe o necessário.
O comando terminate deve ser colocado no metodo execute da thread ou em outro lugar?
Detalhe(no constrututor da thread estou setando FreeOnTerminate(true) para que ela saia da memoria automaticamente quando terminar.
O detalhe é? Onde dou o comando para terminar ela...
Um abraço a todos..
Pablo Rodrigues
Pablo_lima
Curtir tópico
+ 0Posts
20/12/2007
Giordanocwb
Na sua Thread, você manualmente tem que verificar se Terminated está True, e se tiver, você coloca um Exit para que ele saia da procedure Execute, abandonando a execução da Thread.
A Thread será liberada da memória caso esteja FreeOnTerminate, apenas após a execução do método Execute ser finalizada ok.
T+
Gostei + 0
21/12/2007
Pablo_lima
OK Giordano.. Obrigado pela dica.. Somente me confirme se estou fazendo correto veja...
--> Linha de criação da threada (no form principal):
With TNPS_FTP.Criar(´Entrada´) Do
OnTerminate := Msg_NPS_Thread;
//Na thread quando ocorre algum erro ou sucesso no processo, alimento uma var do form principal com um codigo respectivo, e na procedure Msg_NPS_Thread testo o codigo que a thread retornou e solto os showmessages respectivos. Usei assim pque vi que não se usa acesso a vcl ou clx direto de dentro da thread a nao ser pelo sincronize(), então achei melhor nem usar o sincronize e fazer pela procedure Msg_NPS_Thread no form principal.
--> No metodo execute tenho as seguintes linhas:
If Parametro(x) Then //Conteudo passado na criação da thread
Begin
Procedimento A;
Procedimento B;
End;
If Terminated Then Exit;
-> A pergunta é: Preciso na ultima linha do codigo do procedimento A ou B, colocar o ´terminate´?
-> Ou colocar o terminate antes do ´If Terminated then exit´, pque não estou setando este terminate em lugar algum....
-> E outro detalhe.. Quando ocorre algum erro de processamento, dentro do procedimento A, alimento o codigo de erro para apresentar no form principal na procedure acionada por OnTerminate := XXXXX, e dou o comando exit direto de dentro do procedimento A.
Isso faz com que a thread encerre automaticamente, ou ela ainda vai lá no ´If Terminated then exit´?
->Enfim.. são essas duvidas que tenho pque a thread está saindo tudo ok... mas até o momento não estou dando o comando terminate.. então como é que ela sai testando If Terminated then exit.. sendo que não alimentei terminated para true?
Conto com vcs..
Um abraço
Gostei + 0
21/12/2007
Giordanocwb
O comando Terminate você só vai usar se precisar terminar uma thread no meio da sua execução ok.
A questão do erro no ´Procedimento A´, eu faria uma função, retornando Boolean, caso dê erro, você retorna Falso, e testa ´if not(ProcedimentoA) then Exit´, para que ela termine a thread também.
T+
Gostei + 0
21/12/2007
Pablo_lima
Ok Giordano...
Obrigado pelas dicas amigo....
Era realmente dessas orientações que eu estava precisando...
Um grande abraço.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)