Fórum Aguardar procedure finalizar #616781
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
Gostei + 0
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
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)