Como e onde se usa TThread.FreeOnTerminate ?
Bom dia a todos.
Estou iniciando o estudo de threads e me deparei com a seguinte situação:
Se eu precisa para um Thread, como posso fazer isso ?
Pesquisei aqui no fórum e vi que existe a função Thread.FreeOnTerminate que, aparentemente, destrói a thread qdo ela termina, mas não a cancela.
Infelizmente não consegui utilizar esta função.
Alguém saberia com utilizá-la e como parar uma Thread ?
Grato pela atenção.
Estou iniciando o estudo de threads e me deparei com a seguinte situação:
Se eu precisa para um Thread, como posso fazer isso ?
Pesquisei aqui no fórum e vi que existe a função Thread.FreeOnTerminate que, aparentemente, destrói a thread qdo ela termina, mas não a cancela.
Infelizmente não consegui utilizar esta função.
Alguém saberia com utilizá-la e como parar uma Thread ?
Grato pela atenção.
Turbo Drive
Curtidas 0
Respostas
Massuda
06/02/2007
[quote:d317b675e6=´Turbo Drive´]Se eu precisa para um Thread, como posso fazer isso ?[/quote:d317b675e6]Na [b:d317b675e6]sua implementação[/b:d317b675e6] do método TThread.Execute, verifique periodicamente o valor da propriedade TThread.Terminated e se o valor for True [b:d317b675e6]seu código[/b:d317b675e6] deve sair do método TThread.Execute. Exemplo...
[quote:d317b675e6=´Turbo Drive´]existe a função Thread.FreeOnTerminate que, aparentemente, destrói a thread qdo ela termina, mas não a cancela..[/quote:d317b675e6]Essa propriedade apenas define se a thread deve se auto-destruir quando ela é terminada, ela não termina a thread.
procedure TSuaThread.Execute; begin while True do begin ... algo muito importante ... if Terminated then begin Break; end; end; // quando você quiser terminar a thread SuaThread.Terminate;
[quote:d317b675e6=´Turbo Drive´]existe a função Thread.FreeOnTerminate que, aparentemente, destrói a thread qdo ela termina, mas não a cancela..[/quote:d317b675e6]Essa propriedade apenas define se a thread deve se auto-destruir quando ela é terminada, ela não termina a thread.
GOSTEI 0
Turbo Drive
06/02/2007
Grande Massuda, valeu pela aula. Deu certo.
Agora preciso que vc me tire mais uma dúvida.
Dentro da Thread eu trabalho com queries, INI e variáveis locais. A thread se localiza no form principal e é chamada no Onshow desse form.
O problema é que, ao chamar a tela de saída do sistema estou tendo violação de acesso. Se eu comentar a linha que chama a Thread, o sistema sai normalmente sem nenhum erro.
A form de saída e o form principal fazem referência a algumas units em comum, como: ShellApi, zip32(unit que possui as funções da dll Zip32), FileCtrl, entre outrras q o próprio Delphi inclui sozinho.
Poderia me dizer o q pode estar ocorrendo ? E tb como posso utilizar Thread.FreeOnTerminate ?
Grato pela atenção.
Agora preciso que vc me tire mais uma dúvida.
Dentro da Thread eu trabalho com queries, INI e variáveis locais. A thread se localiza no form principal e é chamada no Onshow desse form.
O problema é que, ao chamar a tela de saída do sistema estou tendo violação de acesso. Se eu comentar a linha que chama a Thread, o sistema sai normalmente sem nenhum erro.
A form de saída e o form principal fazem referência a algumas units em comum, como: ShellApi, zip32(unit que possui as funções da dll Zip32), FileCtrl, entre outrras q o próprio Delphi inclui sozinho.
Poderia me dizer o q pode estar ocorrendo ? E tb como posso utilizar Thread.FreeOnTerminate ?
Grato pela atenção.
GOSTEI 0
Massuda
06/02/2007
[quote:c633f30164=´Turbo Drive´]O problema é que, ao chamar a tela de saída do sistema estou tendo violação de acesso. Se eu comentar a linha que chama a Thread, o sistema sai normalmente sem nenhum erro.[/quote:c633f30164]O que você faz ao ´chamar a tela de saída´? Access Violation só ocorre se algo (possivelmente sua thread) tentar usar um objeto/componente que não foi criado ou já foi destruído.
GOSTEI 0
Turbo Drive
06/02/2007
No form de saída eu utilizo duas queries que estão presentes na thread. Será q elas foram destruídas ?
GOSTEI 0
Turbo Drive
06/02/2007
Desculpe, eu acabei não respondendo sua pergunta. Segue abaixo a chamada do form de saída:
try
Application.CreateForm(TFSaida, FSaida);
FSaida.showmodal;
finally
FSaida.Free;
end;
Qdo eu chamo este form pela primeira vez já dá o erro de access violation. Já da segunda vez em diante não ocorre nada. Não existe nada no onshow e nem no oncreate.
Agora qdo eu saio do sistema, fica dando access violation diversas vezes.
try
Application.CreateForm(TFSaida, FSaida);
FSaida.showmodal;
finally
FSaida.Free;
end;
Qdo eu chamo este form pela primeira vez já dá o erro de access violation. Já da segunda vez em diante não ocorre nada. Não existe nada no onshow e nem no oncreate.
Agora qdo eu saio do sistema, fica dando access violation diversas vezes.
GOSTEI 0