Aguardar procedure finalizar

25/09/2021

6

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".

  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?
Responder

Posts

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 Felipe

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

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar