GARANTIR DESCONTO

Fórum Como e onde se usa TThread.FreeOnTerminate ? #337384

06/02/2007

0

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.


Turbo Drive

Turbo Drive

Responder

Posts

06/02/2007

Massuda

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


Responder

Gostei + 0

06/02/2007

Turbo Drive

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.


Responder

Gostei + 0

06/02/2007

Massuda

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


Responder

Gostei + 0

06/02/2007

Turbo Drive

No form de saída eu utilizo duas queries que estão presentes na thread. Será q elas foram destruídas ?


Responder

Gostei + 0

06/02/2007

Turbo Drive

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.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar