Hola de nuevo a todos.
Ya he probado una alternativa: he creado un thread al cual se le puede pasar la dirección del trabajo a realizar, dejando para el proceso principal el trabajo de indicar el estado de progreso. Ahí va la solución:
Proceso principal:
Código Delphi
[-]
type
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
private
public
procedure ProcesoLargo1(datos : integer);
procedure ProcesoLargo2(datos : integer);
end;
var
Form1: TForm1;
implementation
uses unit2;
{$R *.dfm}
procedure tform1.ProcesoLargo1(datos : integer);
begin
sleep(10000);
button1.Caption := inttostr(datos);
sleep(10000);
end;
procedure tform1.ProcesoLargo2(datos : integer);
begin
sleep(10000);
button1.Caption := inttostr(datos);
sleep(10000);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
th : tmythread;
begin
th := tmythread.create(true);
th.ExecTrabajo(form1.ProcesoLargo1,1234);
while th.trabajando do
begin
application.ProcessMessages;
form1.Caption := 'Trabajando ' +floattostr(now);
end;
form1.Caption := 'Trabajo finalizado';
freeAndNil(th);
end;
Proceso del thread:
Código Delphi
[-]
type
TCProcedure = procedure (datos: integer) of object; tmythread = class(TThread)
public
trabajando : boolean;
procedure ExecTrabajo(proc : TcProcedure; losDatos: integer);
protected
datos : integer;
proceso : TcProcedure;
procedure Execute; override;
end;
implementation
procedure tmythread.ExecTrabajo(proc : TcProcedure; losDatos: integer);
begin
trabajando := true;
proceso := proc;
datos := losDatos;
resume;
end;
procedure tmythread.Execute;
begin
proceso(datos); trabajando :=false;
end;
Seguiremos investigando....