Ver Mensaje Individual
  #2  
Antiguo 10-07-2020
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Reputación: 11
bucanero Va camino a la fama
hola a todos

en tu código veo varios cosas que te pueden dar erroes:
-pones el BeginUpdate / EndUpdate dentro del hilo y dentro del bucle, por lo que se repite en cada ciclo, cuando solo es necesario hacerlo una vez al principio y al final del proceso.
-Por otra parte, haces un application.ProcessMessages también dentro del hilo... si ya tienes un hilo secundario, el processMessages no es necesario, y de hacerlo hazlo en el hilo principal.

A mi este código me funciona bien:
Código Delphi [-]
procedure TForm2.ShowFiles(LDirs: TStringDynArray);
begin
    // Se pone el listBox en modo Update fuera del hilo
  lboxDirectorio.Items.BeginUpdate;
    // Se crea el hilo de proceso
  with TThread.CreateAnonymousThread(
    procedure
    var
      s: string;
    begin
        //...
      for s in LDirs do
        lboxDirectorio.Items.Add(TPath.GetFileName(s) + CONST_X);
        //...
    end) do begin
      //se marca para que termine de forma automatica
    freeOnTerminate := true;
      //se asigna el proceso que tiene que hacer cuando termine
    OnTerminate := ThreadTerminate;
      // se inicia el hilo
    start;
  end;
end;

procedure TForm2.ThreadTerminate(sender: TObject);
begin
  // al finalizaz el hilo se pone el listBox en modo normal
  lboxDirectorio.Items.EndUpdate;
  SetLength(Files, 0);
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  files := TDirectory.GetFiles('c:\a');
  ShowFiles(files);
end;

En este ejemplo en particular no utilizo tthread.Synchronize, a pesar de ser lo recomendable para actualizar un componente visual, pero en este ejemplo en particular solo escribe un único hilo de forma secuencial y no debe de dar problemas. En caso de usar varios hilos para actualizar el componente entonces si es ya necesario.
Responder Con Cita