Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > FireMonkey
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-07-2020
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 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
  #2  
Antiguo 13-07-2020
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
El Synchronize es obligatorio a utilizar en todos los Threads en el momento que acceder a un elemento que no sea "thread-safe", como son los componentes de la VCL.
Independientemente de si tú creas varios hilos o sólo uno, porque aunque tú sólo crees uno, hay otro que siempre está funcionando, que es el "Main thread" (el principal de la aplicación). Por lo tanto. debería utilizarse siempre.

Cita:
Empezado por bucanero Ver Mensaje
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Arithmetic exception NickName Firebird e Interbase 5 12-12-2022 22:14:12
Llenar listview desde archivo web paquechu FireMonkey 2 13-09-2018 20:15:37
¿Como llenar un listview con datos seleccionados de un DBlookuplistbox? eduarcol OOP 1 11-08-2007 02:47:06
exception arieliten Conexión con bases de datos 3 21-04-2005 00:27:59
Arithmetic Exception NickName Firebird e Interbase 4 13-09-2004 17:00:42


La franja horaria es GMT +2. Ahora son las 19:02:47.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi