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
lboxDirectorio.Items.BeginUpdate;
with TThread.CreateAnonymousThread(
procedure
var
s: string;
begin
for s in LDirs do
lboxDirectorio.Items.Add(TPath.GetFileName(s) + CONST_X);
end) do begin
freeOnTerminate := true;
OnTerminate := ThreadTerminate;
start;
end;
end;
procedure TForm2.ThreadTerminate(sender: TObject);
begin
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.