Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

Postado

Bom dia.

Estou tendo um problema com o componente ACBrNFSe, e acredito que necessite de alguma ajuste, pois utilizo o mesmo método para os demais componentes de DFe. Segue resumo abaixo:

- Eu tenho um form para a tela de NFSe, e para enviar o Lote RPS eu chamo uma Thread, o envio é feito normal mas quando eu vou fechar o form da NFSe, ele acusa o erro "System error, code 1400. O identificador da janela é inválido".

Já tive esse erro em outras ocasiões, pois trabalho muito com Thread, mas revisei tudo na minha rotina e não identifiquei nenhum problema referente a esse assunto, então acredito que no momento que vou fechar o form, a Thread ainda esteja aberta por algum motivo, ocasionando assim o erro.

Desde já, fico a disposição para qualquer esclarecimento no intuito de identificar e resolver o erro.

  • Consultores
Postado
Em 14/09/2020 at 11:15, Gumercino disse:

- Eu tenho um form para a tela de NFSe, e para enviar o Lote RPS eu chamo uma Thread, o envio é feito normal mas quando eu vou fechar o form da NFSe, ele acusa o erro "System error, code 1400. O identificador da janela é inválido".

Precisamos de um passo a passo pra poder reproduzir o problema. No entanto, não creio que seja um problema no componente. Até onde me lembro o componente não gera "handles" de janelas. E esse parece ser justamente o seu problema. Sua thread está criando handles, mas é a thread da VCL que está tentando destruir.

Encontrei essa resposta no StackOverflow. Creio que entender o princípio por trás da resposta pode te ajudar. Em especial, essa parte:

Citar

Window handles are the strict property of the thread in which they were created. You cannot create a window handle in one thread and then destroy it in another.

NOTE: This is a fundamental of Windows, not Delphi.

 

  • Curtir 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Postado

Boa tarde.

Então, eu utilizo o mesmo padrão para os demais componentes de DFe, como NFE, CTe e MDFe, e não tenho esse problema que estou tendo com a NFSe. Revisei todo meu código e não consegui encontrar nada que estivesse causando esse erro. Trabalho com thread para diversas outras coisas. Vou dar uma olhada no link que você mencionou acima, e ver se encontro alguma coisa.

O passo a passo é o seguinte:

- Tenho um form para a tela de NFSe;

- Chamo um form de animação para cada rotina da NFSe (Enviar, Consultar por Lote, Consultar por RPS e Cancelar);

- Dentro desse form de animação eu chamo a thread da seguinte maneira:

procedure TFMensagem.ExecutarNFSeProvedorABRASF;
var
  vThread: TThreadNFSeProvedorABRASF;
begin
  vThread                 := TThreadNFSeProvedorABRASF.Create(True);
  vThread.FreeOnTerminate := True;
  vThread.Start;

end;

- Ao finalizar a thread ela fecha o form de animação retornando ao form da NFSe.

 

Não acontece erro algum até esse momento, consigo trabalhar normalmente com as demais telas do sistema, pois o erro só ocorre quando fecho o form da NFSe após ter executado alguma rotina da NFSe.
 

A thread esta em anexo, e caso necessite de mais alguma informação ou esclarecimento, estou a disposição.

     

UThreadNFSeProvedorABRASF.pas

  • Consultores
Postado
20 horas atrás, Gumercino disse:

A thread esta em anexo, e caso necessite de mais alguma informação ou esclarecimento, estou a disposição.

Dei uma olhada por alto na sua thread e estou levando em conta que você já a utiliza há algum tempo sem nenhum ou maiores problemas.

O código que você anexou é apenas parte da implementação, porque essa unit faz uso extenso de outras que não faço ideia de como estão implementadas. Não tem afirmar nada sem um código completo.

Mas notei alguns pontos sensíveis que podem levar a um problema maior depois. Por exemplo:

  1. Você cria um componente de query na thread, mas todos os outros já estão criados num DataModule(DM.conGestor, DM.transGestor, etc..).
    Geralmente a thread deve ter sua própria conexão com o BD. Isso acontece porque os componentes da VCL de modo geral não são threadsafe.
  2. Você faz acesso direto a forms sem o controle do syncrhonize. Por exemplo na configuração do componente ACBrNFSe1 que está em um form fora da thread. Sem um mecanismo de lock, isso pode gerar problemas.
  3. Outro exemplo do acima é que o form que cria a thread é acessado pela thread de modo direto. Isso pode gerar problemas. Em via de regra, thread só pode acessar qualquer coisa que esteja na interface com o usuário via método syncrhonize.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Postado

Obrigado pelos pontos que você levantou EMBarbosa, vou verificar todos e tentar adaptar em todas as minhas threads.

Referente a essa em específico, eu utilizo ela da mesma maneira que as outras e não tenho problema com as demais. Vou anexar a thread que utilizo para NFe para que você possa verificar que as duas tem o mesmo padrão.

UThreadNFe.pas

  • Consultores
Postado
1 hora atrás, Gumercino disse:

Obrigado pelos pontos que você levantou EMBarbosa, vou verificar todos e tentar adaptar em todas as minhas threads.

Referente a essa em específico, eu utilizo ela da mesma maneira que as outras e não tenho problema com as demais. Vou anexar a thread que utilizo para NFe para que você possa verificar que as duas tem o mesmo padrão.

UThreadNFe.pas 24 kB · 0 downloads

Oi Gumercindo.

   O código é muito complexo pra eu conseguir analisar. Eu até tentei olhar aqui, mas não tem como fazer isso com pouco tempo e sem o restante do seu software.

   De qualquer maneira, eu sugiro você tentar outra abordagem. Ao invés de tentar comparar as duas. Veja onde a sua falha e tende descobrir a partir daí.

   No link que te passei, menciona que um motivo dessa mensagem é a tentativa de destruição de um handle que foi alocado por uma thread diferente.

   Então uma opção interessante seria você descobrir qual handle estava sendo destruído na hora que o erro foi levantado. A partir daí, você pode tentar encontrar onde ele está sendo criado.

   Outra opção é você tentar reduzir o código a um programa mínimo que reproduza o problema. Vá removendo código do programa até que consiga isolar o problema com o mínimo de código possível. É o mesmo princípio usado na Stack Overflow.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

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

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Postado

Tá ótimo EMBarbosa.

Agradeço pela atenção e ajuda.

Vou fazer as tentativas que me sugeriu e caso eu consiga solucionar retorno aqui para compartilhar.

Abraços

  • Curtir 1
  • Este tópico foi criado há 1529 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.