TMemo BeginUpDate ... EndUpDate - Firemonkey Delphi 10.2

Delphi

28/12/2023

Bom dia, estou tendo um problema utilizando Memo.Lines.BeginUpdate e Memo.Lines.EndUpdate, segue abaixo código, depois explico onde esta o problema.

procedure TfrmGeneratorLF_2.Button9Click(Sender: TObject);
var
  TodasDezenas: TArray<Integer>;
  ResultadoComb: TArray<TArray<Integer>>;
  Stopwatch: TStopwatch;
  j, QtdDezenasCercar, QtdDezenas: Integer;
  CombStrList: TStringList; // Usando TStringList para armazenar as combinações
  TempoMilissegundos: Int64;
  TempoFormatado: string;
  CombString: string;
  HoraAtual: TDateTime;
begin
  // Código ....

  MemoResultado.Lines.BeginUpdate;

  try
    if Length(ResultadoComb) > 0 then
    begin
      for j := 0 to High(ResultadoComb) do
      begin
        // Cria a string de combinação com dezenas formatadas
        CombString := Format('Combinação %.*d: %s', [Length(IntToStr(Length(ResultadoComb))), j + 1, FormatDezenas(ResultadoComb[j])]); //  j MAIS 1,

        // Adiciona a string à lista
        CombStrList.Add(CombString);

        // Adiciona a cada 15000 combinações
		// Esse Loop esta demorando menos de 10 segundo pra adicionar no MemoResultado as combinações
        if (j + 1) mod 15000 = 0 then // if (j MAIS 1) mod 15000 = 0 then
        begin
          // Adiciona as strings de CombStrList ao MemoResultado
          MemoResultado.Lines.AddStrings(CombStrList);

			// Adiciona a hora atual ao MemoObsForasDoFiltros
			// Pra ver a horar que entrou nesse loop adicionando as 15000 Combinações no MemoResultado
			//Mais abaixo esta a hora do Windows que entrou no Loop
          HoraAtual := Now;
          MemoObsForasDoFiltros.Lines.Add('  ' + FormatDateTime('hh:nn:ss:zzz', HoraAtual)); // ('  ' MAIS FormatDateTime('hh:nn:ss:zzz', HoraAtual))

          // Limpa CombStrList para o próximo lote
          CombStrList.Clear;
        end;
      end;
    end;
		 
    // Adiciona as strings restantes de CombStrList ao MemoResultado
    MemoResultado.Lines.AddStrings(CombStrList);
	
  finally
    CombStrList.Free;
	
	//Esta demorando aqui, quase 5 minutos após ter inserido 490314 Combinações no MemoResultado       
	MemoResultado.Lines.EndUpdate;	
  end;

  // Restante do Código...Loop Combinaões 10:33:44:788
end;


Loop Combinaões 10:33:44:998
Loop Combinaões 10:33:45:411
Loop Combinaões 10:33:45:616
Loop Combinaões 10:33:45:827
Loop Combinaões 10:33:46:034
Loop Combinaões 10:33:46:244
Loop Combinaões 10:33:46:450
Loop Combinaões 10:33:46:655
Loop Combinaões 10:33:46:859
Loop Combinaões 10:33:47:069
Loop Combinaões 10:33:47:277
Loop Combinaões 10:33:47:487
Loop Combinaões 10:33:47:694
Loop Combinaões 10:33:47:904
Loop Combinaões 10:33:48:108
Loop Combinaões 10:33:48:319
Loop Combinaões 10:33:48:523
Loop Combinaões 10:33:48:739
Loop Combinaões 10:33:48:949
Loop Combinaões 10:33:49:161
Loop Combinaões 10:33:49:381
Loop Combinaões 10:33:49:588
Loop Combinaões 10:33:49:797
Loop Combinaões 10:33:50:005
Loop Combinaões 10:33:50:216
Loop Combinaões 10:33:50:420
Loop Combinaões 10:33:50:629
Loop Combinaões 10:33:50:841
Loop Combinaões 10:33:51:054
Loop Combinaões 10:33:51:266

Se observarem ele insere todas as 490314 no MemoResultado em menos de 10 segundos, mais finaliza o processo em quase 5 minutos pra visualizar na tela.
Me ajudem com uma solução.
Rubens Pena

Rubens Pena

Curtidas 0

Respostas

Claudio Andrade

Claudio Andrade

28/12/2023

Pela carga no FOR que você esta dando, acredito que a utilização de paralelismo seria interessante nessa situação.
Veja esse link abaixo como usar no Delphi e quem sabe resolver seu problema.

https://www.andrecelestino.com/delphi-utilizando-o-mecanismo-de-processamento-paralelo/



Boa sorte!
GOSTEI 0
POSTAR