Hola.
Los hilos son "potentes", pero antes de "liarse la manta a la cabeza" y ponerse a programar hilos, habría que intentar entender y leer cómo funcionan mínimamente, porque también son "delicados".
Hay varias preguntas y varias cosas a comentar en este hilo.
En cuanto a las preguntas:
Cita:
Empezado por joseprad
Necesito retomar el control de un programa después de terminar un hilo.
|
El control del programa lo retomas justo después de ejecutar el hilo; En este caso justo después de hacer el
create, ya que lo has creado con el parámetro
CreateSuspended a
False. Ese es el propósito del hilo, que el programa continue (y no se bloquee) mientras el hilo trabaja. Así que justo después de hacer el Create, tu programa principal y el hilo comienzan a trabajar en "paralelo".
Otra cosa es cómo saber cuando el hilo termina. Pasa eso debes utilizar el evento
OnTerminate, que se lanza cuando el hilo acaba. Para poder usar este evento, debes asignar al Thread este procedimiento antes de lanzarlo. Cuando acabe el control volverá a este procedimiento, para hacerte saber que ya ha acabado.
Si buscas en los foros sobre este evento, seguro que encuentras ejemplos(
por ejemplo este).
Fíjate que al crear el thread hace algo como esto:
Código Delphi
[-]
var
NewThread: TCheckUpdate;
begin
NewThread := TCheckUpdate.Create(True);
NewThread.FreeOnTerminate := True;
NewThread.OnTerminate := HandleTerminate;
NewThread.Resume;
....
NOTA: En este caso para asegurar la asignación crealo con el parámetro a
True y haz el
resume manualmente, como está en el código de ejemplo.
Y tiene definido este procedimiento como:
Código Delphi
[-]
procedure TfrmMain.HandleTerminate(Sender: TObject);
begin
LogMsg('Cheking for new version..');
if (Sender as TCheckUpdate).Return=1 then
begin
btnUpdate.Action := actUpdateServer;
LogMsg('New version available. Please update the server');
end else begin
btnUpdate.Action := actUptoDate;
LogMsg('Server is up to date!');
end;end;
Cuando el hilo termine el control volverá a HandleTerminate.
Por otro lado, comentas esto:
Cita:
Empezado por joseprad
Conforme, pero no puedo salir del hilo y continuar.
|
No acabo de entender a qué te refieres con esto.
Si lo has hecho correctamente, tal y como he dicho, tu programa continua al iniciar el hilo (no se bloquea). Y "salir" del hilo no debes hacerlo tú, al acabar el trabajo el hilo finaliza.
Otra cosa es que quieras interrumpir el trabajo del hilo "a medias". Para eso debes utilizar la propiedad
Terminated dentro del hilo, como si fuera un flag; Algo así:
Código Delphi
[-]
...
if (Terminated) then
...interrupir el trabajo del hilo de forma manual
end;
...
En cuanto al código que has puesto, tal y como te ha comentado Agustín, es seguro que la modificación de los Edit directamente (sin
Synchronize) te va a dar problemas y probable que el
Application.ProcessMessagess también.
Debes arreglar esto antes de nada, porque eso te puede estar provocando cualquier otro mal funcionamiento del código (incluidos errores de Access Violation).
Un saludo.