Ir para conteúdo
  • Cadastre-se

dev botao

Tratamento de erro na execução de TDFeSendThread


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

Recommended Posts

Olá!

Estou usando a configuração TimeOutPorThread (criada na revisão 14797) e estava enfrentando alguns erros de Access Violation em alguns clientes. Analisando verifiquei que o erro estava no método Enviar da classe TDFeSSL, mais especificamente no bloco abaixo:

    EndTime := IncSecond(now,TruncFix(TimeOut/1000));
    SendThread := TDFeSendThread.Create( Self,
                                         TDFeSSLHttpClassOf(FSSLHttpClass.ClassType),
                                         ConteudoXML, AURL, ASoapAction, AMimeType);
    try
      while (SendThread.Response = '') and (Now <= EndTime) do
        Sleep(50);
    finally
      Result := SendThread.Response;
      SendThread.Abort;
    end;

A TDFeSendThread não tinha nenhum tratamento de exceção no Execute e quando ocorriam erros na execução, como um erro de conexão ou sem Internet, a thread era abortada e no finally a variável SendThread já não existia mais, causando o AV. Acontecia esporadicamente e não era muito fácil de simular.

Para corrigir o problema, implementei um tratamento de exceção no Execute da thread e tratei para abortar o while de verificação caso algum erro ocorra. Também alterei para que a thread fosse liberada manualmente ao final do envio.

Peço que analisem e subam para o SVN se possível.

ACBrDFeSSL.pas

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

  • Fundadores

Desculpe-me pela demora na resposta...

Verifiquei a sua sugestão, e realmente faltou um tratamento interno para a Thread, capturar os Exceptions.. O Exception disparado abortava o código da Thread, que já era liberada pelo FreeOnTerminate, por isso tínhamos o A.V.

Essa Thread tem uma característica diferente das Threads tradicionais... A ideia é deixar que ela mesmo se libere... Isso porque lidar com Socktes, pode prender o sistema, mesmo quando configuramos os TimOuts na API.. então não podemos ficar esperando o final normal da Thread...

Fiz alguns ajustes, baseado nas suas sugestões...

Por favor teste com a Unit em anexo... Também fiz algumas melhorias, para o caso abaixo:

 

ACBrDFeSSL.pas

  • Curtir 2
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

Fiz testes usando a unit que você alterou e voltou a acontecer o A.V. Consegui simular da seguinte forma:

- Adicionei um "raise exception" dentro do Execute da thread apenas para forçar um erro qualquer.

- Fiz o envio de algumas notas em sequência.

Em algumas notas ocorreu o A.V. no finally do código que pega as informações da thread após finalizá-la, conforme o comentário que coloquei abaixo:

Citar

   try
      while (not SendThread.Done) and (Now <= EndTime) do
        Sleep(50);
    finally

      // O A.V. ocorreu nas linhas abaixo. O objeto SendThread foi liberado da memória antes de conseguir capturar as mensagens.
      Result := SendThread.Response; 
      ErrorMsg := SendThread.ExceptMessage;

      SendThread.Abort; // Isso forçará a Thread terminar, e morrer por si...
    end;

Parece-me que após Abortar a thread no tratamento de exceção e antes de capturar as mensagens de Response e ExceptMessage a thread está sendo liberada. Esse problema não aconteceu em todas as notas que tentei enviar.

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Uma nova tentativa... por favor teste com a Unit em anexo...

Nessa nova modificação, ligo o FreeOnTerminate, apenas quando a Thread atingiu o timeout... assim não ficamos presos no "Thread.waitfor", quando aplicarmos o Abort.

 

ACBrDFeSSL.pas

  • Curtir 1
Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

  • Administradores

Bom dia.

Alteração no svn, tópico será encerrado.

Att.a sim

  • Obrigado 1
Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 1998 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • 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.

The popup will be closed in 10 segundos...