Ver Mensaje Individual
  #1  
Antiguo 07-12-2013
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Reputación: 18
anubis Va por buen camino
manejo de threads ...

hola amigos,

La verdad no he usado threads porque, en teoria, no me han hecho falta .
tengo una aplicacion que se conecta remotamente a una base de datos firebird y quería poder poner un progressbar mientras se espera que se carguen algunos datos.
Ya estuve mirando sobre los threads con algunos enlaces que habeis recomendado pero no me aclaro mucho.
Mi idea es que saque el progressbar en pantalla mientras se carguen los datos o una animacion, el caso es que no parezca que se ha congelado la aplicacion mientras esta en el proceso.

Estaba probando este ejemplo pero no va muy bien:
Código Delphi [-]
type
{ TMiHilo }

  TMiHilo = class(TThread)
  private
    procedure AvanzaBarra;
  protected
    procedure Execute; override;
  public
    constructor Create(CreateSuspended: boolean);
  end;


  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    ProgressBar1: TProgressBar;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
    MiHilo : TMiHilo;
    begin
        //creamos el hilo, pero no lo iniciamos
        MiHilo := TMiHilo.Create(True); // Con el parametro true no se inicia automaticamente
        if Assigned(MiHilo.FatalException) then
           raise MiHilo.FatalException;
        //si no hay ninguna excepción lo iniciamos
        MiHilo.Start;

end;
{ TMiHilo }

procedure TMiHilo.AvanzaBarra;
//Este metodo solo es llamado por Synchronize(@AvanzaBarra) y por ello
// es ejecutado por el hilo principal.
//El hilo principal puede acceder a los elementos visuales del GUI por ejemplo a la progressbar
begin

    Form1.ProgressBar1.StepIt;

    if Form1.ProgressBar1.Position = Form1.ProgressBar1.Max then begin
        Form1.ProgressBar1.Position := 0;
    end;
end;

//Este proceso se ejecuta al iniciar el hilo
procedure TMiHilo.Execute;
begin

    //mientras no termine y sea verdadero se ejecutará
    while (not Terminated) and (true) do begin
        //este loop es del hilo principal
        Synchronize(@AvanzaBarra);
    end;
end;

constructor TMiHilo.Create(CreateSuspended: boolean);
begin
    //Con esta propieda del hilo no necesitamos liberarlo manualmente al terminar de ejecutar el hilo
    FreeOnTerminate := True;
    inherited Create(CreateSuspended);
end;


end.

Le doy al botón para que inicie pero no se llena la barra.
Ademas no veo donde puedo colocar el codigo para que mi aplicacion continue.

Si me orientais un poco .
Responder Con Cita