Como e quando terminar uma thread?

Delphi

20/12/2007

Amigos...
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

Pablo_lima

Curtidas 0

Respostas

Giordanocwb

Giordanocwb

20/12/2007

O comando Terminate apenas configura Terminated para True, nada além disso.

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
Pablo_lima

Pablo_lima

20/12/2007

O comando Terminate apenas configura Terminated para True, nada além disso. 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+


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
Giordanocwb

Giordanocwb

20/12/2007

A thread vai executar tudo o que estiver dentro do procedimento Execute, se ela executar tudo normal, ao final da execução ela vai terminar automaticamente, não precisa dar o comando Terminate.

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
Pablo_lima

Pablo_lima

20/12/2007

A thread vai executar tudo o que estiver dentro do procedimento Execute, se ela executar tudo normal, ao final da execução ela vai terminar automaticamente, não precisa dar o comando Terminate. 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+


Ok Giordano...
Obrigado pelas dicas amigo....

Era realmente dessas orientações que eu estava precisando...
Um grande abraço.


GOSTEI 0
POSTAR