Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema con hilo y pantalla inactiva (https://www.clubdelphi.com/foros/showthread.php?t=78089)

MLROJO 19-03-2012 22:46:29

Problema con hilo y pantalla inactiva
 
Hola,

Os comento, estoy desarrollando una aplicación a la que pretendo introducirle una funcionalidad que consiste en realizar una serie de tareas en modo background, a la vez que se ejecuta y puede interactuar el usuario con ella, sin que se la bloquee.

Pues bueno, para ello he creado una clase nueva, que desciende de TThread:

Código Delphi [-]
  TListaThread = class(TThread)
  private
  lst: TCheckListBox;
  protected
    procedure Execute; override;
    procedure Listar;
  public
    constructor Create(Box: TCheckListBox; ThreadPriority: TThreadPriority);
  end;

Con sus respectivos metodos:

Código Delphi [-]
constructor TListaThread.Create(Box: TCheckListBox; ThreadPriority: TThreadPriority);
begin
  inherited Create(False);
  lst := box;
end;

procedure TListaThread.Execute;
begin
  Synchronize(Listar);
end;

procedure TListaThread.Listar();
begin
  Sto_SearchDirectory(lst.Items, 'c:\','*.txt', true,true);
end;

Donde Sto_SearchDirectory es una función que devuelve los ficheros encontrados según la ruta y demás opciones.

Por otra parte desde el formulario, defino la variable y creo el hilo:

Código Delphi [-]
var
  TLi1 :TListaThread;

Código Delphi [-]
procedure TFormMain.Button1Click(Sender: TObject);
begin
  TLi1 := TListaThread.Create(CheckListBox1, tpNormal);
end;

Todo funciona bien, el problema está en que el formulario queda "colgado" mientras se ejecuta, es decir, no hay diferencia entre hacerlo así y poner directamente el Sto_SearchDirectory sin crear el hilo, etc..

Que hago mal? o es así y con esto no se consigue lo que quiero?

Gracias,

Saludos.

CSIE 20-03-2012 15:59:46

Hola MLROJO

El problema es que si usas el "Synchronize" de ese modo, lo que estas haciendo es lo mismo que si lo ejecutas en el hilo principal.

Lo normal es que incluyas el método Sto_SearchDirectory en el thread y solo uses "Synchronize" cuando tienes que añadir elementos a lst.

Saludos.

MLROJO 22-03-2012 21:28:18

Hola,

Muchas gracias, efectivamente, utilicé solamente "Synchronize" para añadir los datos a la lista y funcionó perfectamente.

Gracias de nuevo,

Saludos.


La franja horaria es GMT +2. Ahora son las 14:30:38.

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