Aguardar procedure finalizar
25/09/2021
0
Tenho uma tela onde realizo a importação de CFe e estou realizando algumas melhorias nela. Antes só era possível importar os arquivos de uma empresa por vez. "Agora estou tentando importar de 3 empresas por vez." Coloquei 3 combo box onde o usuário escolhe a empresa e os edits onde fica o patch dos arquivos. Fiz um for onde valida se um chebox está true / false de cada empresa se vai importar ou não. Caso estiver true vai chamar a procedure que realiza a importação e dentro desta procedure existe uma anonymous thread apenas para o windows não ficar marcando o sistema como "não respondendo".
O problema é que se eu tentar importar as três lojas ao mesmo tempo, ele chama a procedure 3 vezes ao mesmo tempo e isso causa erro pois começa bagunçar as informações das lojas que a procedure recebe.
Existe uma forma de eu aguardar o processamento da procedure para depois ele continuar o for?
Ou de que outra maneira eu poderia fazer isso?
for Cont := 0 to Self.ComponentCount - 1 do begin if (Self.Components[Cont] is TCheckBox) then begin if ((Self.Components[Cont] as TCheckBox).Name = 'CheckBoxUnid1') and ((Self.Components[Cont] as TCheckBox).Checked = True) then begin ImportacaoCFe(cmbUnidadeNegocio1,edtOrigem1); end; if ((Self.Components[Cont] as TCheckBox).Name = 'CheckBoxUnid2') and ((Self.Components[Cont] as TCheckBox).Checked = True) then begin ImportacaoCFe(cmbUnidadeNegocio2,edtOrigem2); end; if ((Self.Components[Cont] as TCheckBox).Name = 'CheckBoxUnid3') and ((Self.Components[Cont] as TCheckBox).Checked = True) then begin ImportacaoCFe(cmbUnidadeNegocio3,edtOrigem3); end; end; end;
O problema é que se eu tentar importar as três lojas ao mesmo tempo, ele chama a procedure 3 vezes ao mesmo tempo e isso causa erro pois começa bagunçar as informações das lojas que a procedure recebe.
Existe uma forma de eu aguardar o processamento da procedure para depois ele continuar o for?
Ou de que outra maneira eu poderia fazer isso?
Paulo
Curtir tópico
+ 0
Responder
Posts
27/09/2021
Emerson Nascimento
var Componente: TComponent; for Cont := 0 to Self.ComponentCount - 1 do begin Componente := Self.Components[Cont]; if (Componente is TCheckBox) then begin if (Componente.Name = 'CheckBoxUnid1') and TCheckBox(Componente).Checked then ImportacaoCFe(cmbUnidadeNegocio1,edtOrigem1); if (Componente.Name = 'CheckBoxUnid2') and TCheckBox(Componente).Checked then ImportacaoCFe(cmbUnidadeNegocio2,edtOrigem2); if (Componente.Name = 'CheckBoxUnid3') and TCheckBox(Componente).Checked then ImportacaoCFe(cmbUnidadeNegocio3,edtOrigem3); end; end;
você pode deixar de usar thread e usar, dentro das iterações, o comando Application.ProcessMessages.
ou manter o uso da thread e torná-la autossuficiente, de modo a criar os datasets necessários em tempo de execução no escopo da thread, para não misturar informações por usar datasets comuns.
Responder
27/09/2021
Paulo
var Componente: TComponent; for Cont := 0 to Self.ComponentCount - 1 do begin Componente := Self.Components[Cont]; if (Componente is TCheckBox) then begin if (Componente.Name = 'CheckBoxUnid1') and TCheckBox(Componente).Checked then ImportacaoCFe(cmbUnidadeNegocio1,edtOrigem1); if (Componente.Name = 'CheckBoxUnid2') and TCheckBox(Componente).Checked then ImportacaoCFe(cmbUnidadeNegocio2,edtOrigem2); if (Componente.Name = 'CheckBoxUnid3') and TCheckBox(Componente).Checked then ImportacaoCFe(cmbUnidadeNegocio3,edtOrigem3); end; end;
você pode deixar de usar thread e usar, dentro das iterações, o comando Application.ProcessMessages.
ou manter o uso da thread e torná-la autossuficiente, de modo a criar os datasets necessários em tempo de execução no escopo da thread, para não misturar informações por usar datasets comuns.
Valeu pena dica, optei por criar os datasets em tempo de execução assim posso fazer os 3 processos ao mesmo tempo fazendo com que eu economize muito tempo.
Responder
Clique aqui para fazer login e interagir na Comunidade :)