Ir para conteúdo
  • Cadastre-se

dev botao

Dúvida sobre finalizar Thread com Terminate


  • Este tópico foi criado há 1168 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Pessoal estou montando uma automação para buscar os xmls das notas a cada x horas, ate então o processo era manual.

Tenho uma Thread que é criada suspensa setado  FreeOnTerminate = True;    e o evento OnTerminate := ReportarFimThread; é onde verifico a finalização da Thread;

No bloco execute da Thread um

  while not Self.Terminated do

    begin   

       Sleep(tempo em horas);

      if Terminated then Abort;

     Rotina Consulta;

      if Terminated then Abort;

     Rotina BuscaXmls;

     if Terminated then Abort;

     Rotina manifestar Ciência;

    if Terminated then Abort;

 end;

 

Acontece que se eu no form principal dou Thread.Terminate;

no evento Thread.OnTerminate  não consigo acusar a finalização através de 

    if Thread.Finished  then ...

o que verifico é que sempre é criado uma exceção 

   if Assigned(TThread(Sender).FatalException) then
    GeraLogDFe('<SinalizaFinalThreadDfe> '+ Exception(TThread(Sender).FatalException).Message);

 

OnTerminate sempre causa uma exceção ?

Link para o comentário
Compartilhar em outros sites

Oi @Daniel Simoes eu tive que abandonar minha ideia de dentro da thread controlar o tempo, deixar ela rodando ate que fosse interrompida com Terminated.

Simplesmente, Thread.Terminated não faz com que a Thread se encerre de imediato, com exemplos mexendo em controles da VCL isso pode ate dar certo, mas depende muito da operação que esta sendo feita.

Pra usar WaitFor e FreeAndNil somente se eu fizesse Self.FreeOnTerminate := False; 

Não sei se isso pode ser útil a alguém mas a solução que resolveu partiu de algo bem simples.

Form1
  Timer1: TTimer;
  private
  _FLAG : boolean;
    oDFeThead : TDfeThread;
  procedure ReportFimThreadDfe(Sender: TObject);
  public


procedure TForm1.Timer1Timer(Sender: TObject);
begin
  GeraLogDFe('ThreadDfe iniciada !');
  _FLAG := True;
  Timer1.Enabled := not _FLAG;

  oDFeThead := TDfeThread.Create(True);
  oDFeThead.OnTerminate := ReportFimThreadDfe;
  oDFeThead.Start;
end;

procedure TForm1.ReportFimThreadDfe(Sender: TObject);
begin
  _FLAG := False;
  Timer1.Enabled := not _FLAG; 
end;


Agradeço de qualquer forma a ajuda

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 1168 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.