Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-01-2015
joseprad joseprad is offline
Miembro
 
Registrado: oct 2006
Posts: 36
Poder: 0
joseprad Va por buen camino
Salir de TThread

Hola amigos.
Necesito retomar el control de un programa después de terminar un hilo.
Pongo un esquema del programa
Código Delphi [-]
type
THilo=class(TTHread)
   procedure Execute; override;
   procedure Terminar;


TFormImportar=Class(TForm)
   procedure btoInicarClic(Sender:TObject)
   procedure Final;
   procedure LimpiarPantalla;
end;

var
  frmImportar:TFrmImportar;
  Hilo:THilo;

Implementation

procedure TFrmImportar.btoIniciar(selder:TObject;
begin
   Hilo:=THilo.Create(False);
end;

procedure TfrmImportar.Terminar;
begin
  Application.MessageBox('Finalizado el proceso',
    'Actualitzar', MB_OK + MB_ICONINFORMATION);
  LimpiarPantalla;
end:

procedure TFrmImporter.LimpiarPantalla;
begin
  edit1.text:='';
  edit2.text:='';
  //....
end;

{THilo}

procedure THilo.Execute;
begin
  inherited;
  FreeOnTerminate;
  IniciarProceso;
  Terminar;
end;

procedure THilo.Terminar;
begin
  Terminate;
  frmImportar.Terminar;
end;

procedure THilo.IniciarProceso;
begin
  //....
end;

end;

Al terminar ejecuta el MessageBox, pasa por el procedimiento LimpiarPantalla, pero no me limpia los edits.

Pueden indicarme que es lo que esta mal?.
Muchas gracias
Responder Con Cita
  #2  
Antiguo 01-01-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
La VCL no es thread-safe, no podes modificar propiedades de los controles dentro de un thread directamente. Tenes que usar el Synchronize

Revisa este Post de Neftali
Responder Con Cita
  #3  
Antiguo 02-01-2015
joseprad joseprad is offline
Miembro
 
Registrado: oct 2006
Posts: 36
Poder: 0
joseprad Va por buen camino
Conforme, pero no puedo salir del hilo y continuar.
Responder Con Cita
  #4  
Antiguo 02-01-2015
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.285
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
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 Ver Mensaje
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;//if
end;

Cuando el hilo termine el control volverá a HandleTerminate.

Por otro lado, comentas esto:

Cita:
Empezado por joseprad Ver Mensaje
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.
__________________
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.

Última edición por Neftali [Germán.Estévez] fecha: 02-01-2015 a las 12:40:02.
Responder Con Cita
  #5  
Antiguo 03-01-2015
joseprad joseprad is offline
Miembro
 
Registrado: oct 2006
Posts: 36
Poder: 0
joseprad Va por buen camino
Hola Neftali.
Lo que nos pasa a los que somos autodidactas es que a veces cogemos los conceptos equivocados, creemos que sabemos i no sabemos nada.
Muchas gracias por tu respuesta.Estudiando tu respuesta y tus ejemplos de threads se me han aclarado bastante los conceptos que tenia equivocados.
Muchas gracias y un saludo.
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
Problema con librería DLL y TThread frangarrob Varios 3 07-12-2012 20:19:00
FTP y TThread keys Internet 4 01-06-2011 08:12:43
TThread y componentes de red noob OOP 0 18-04-2009 01:25:07
Como Liberar un Tthread???? AGAG4 Varios 3 25-04-2005 22:16:40
Lio con TThread diegofhernando Varios 0 20-01-2004 17:58:35


La franja horaria es GMT +2. Ahora son las 22:50:31.


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