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 15-11-2006
deivi deivi is offline
Miembro
 
Registrado: feb 2004
Posts: 19
Poder: 0
deivi Va por buen camino
Unhappy Parar un hilo de ejecución

Tengo un hilo de ejecución casi consitnuo que controla las entradas desde una base de datos y la enseña en pantalla. Lo malo es que si cierro la pantalla cuando el hilo está ejectuandose, me da un error. ¿Alguién sabe como destruir en un hilo que se está ejecutando? ¿O pararlo? Cualquier cosa que lo detenga para que no de el fallo. Muchas gracias.
Responder Con Cita
  #2  
Antiguo 15-11-2006
oscarnoe oscarnoe is offline
Miembro
 
Registrado: jul 2006
Posts: 60
Poder: 18
oscarnoe Va por buen camino
Primero te recomendaria separar el codigo del hilo del form y teoricamente, con terminate y un comprobacion de la propiedad terminated del hilo para salir del bucle principal del hilo.

En la ayuda de delphi pone el siguiente codigo
Código Delphi [-]
procedure TMyThread.Execute;
begin
  while not Terminated do
    PerformSomeTask;
end;

yo lo extenderia asi
Código Delphi [-]
procedure TMyThread.Execute;
begin
  //inicializacion de objetos
  try
    while not Terminated do
    begin
      // haz lo que debas
    end;
  finally
    // liberacion/finalizacion de objetos
  end;
end;
__________________
No dejes camino viejo por sendero nuevo
Responder Con Cita
  #3  
Antiguo 20-11-2006
deivi deivi is offline
Miembro
 
Registrado: feb 2004
Posts: 19
Poder: 0
deivi Va por buen camino
no me sirve

la respuesta anterior entiendo que mientras no se termine el hilo, siga ejectuandose, pero lo que necesito es que esté en el punto que esté el hilo, pararlo. El hilo puede estar al principio de su ejecución, o a mitad, o al final. Pero independientemente de donde esté necesito matarlo para poder salir del form sin que me de un fallo.
Responder Con Cita
  #4  
Antiguo 20-11-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

¿No bastaría con ejecutar el método "Terminate"? Es decir, cuando se va a cerrar el formulario en cuestión ejecutar el método "Terminate" del Hilo. En ese momento el se saldrá del "bucle" que se está ejecutando a su vez en el Hilo. ¿No?
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 20-11-2006
oscarnoe oscarnoe is offline
Miembro
 
Registrado: jul 2006
Posts: 60
Poder: 18
oscarnoe Va por buen camino
Tienes que comprobar en cualquier bucle y esporadicamente, que el hilo no este terminado, y si es asi, salir y limpiar cualquier objeto que tengas creado. En un hilo simple donde todo el codigo estuviera en el Execute, el ejemplo anterior es lo basico. Si llamas a varios metodos desde el execute, entonces deberias comprobar en esos metodos la propiedad "Terminated" para abortar la operacion en cuanto sea necesario. Y como dice Dec, en cualquier punto del form, llamas a Hilo.Terminate y con un chequeo de la propiedad terminated en el Hilo debe finalizar rapido. Por otra parte un buen sitio para el terminate es en OnCloseQuery, ya que si por alguna razón no puedes terminar el hilo, abortas el cierre de la aplicacion/ventana.

Espero que te sea de ayuda
__________________
No dejes camino viejo por sendero nuevo
Responder Con Cita
  #6  
Antiguo 21-11-2006
deivi deivi is offline
Miembro
 
Registrado: feb 2004
Posts: 19
Poder: 0
deivi Va por buen camino
lo he intentado

he intenado hacer hilo.terminate, pero lo tiene la función. pongo hilo. y en el desplegable que sale en delhpi me aparecen 3 ocpiones nada más. ¿Como hay que crear el hilo para que tenga la función terminate?
Responder Con Cita
  #7  
Antiguo 21-11-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Si has creado un nuevo "Hilo" derivándolo de la clase "TThread" (que es lo habitual, creo) tu Hilo debería contar ya con el método "Terminate", puesto que es "TThread" quien implementa dicho método. Por otro lado el procedimiento "Terminate" se reduce a esto:

Código Delphi [-]
procedure TThread.Terminate;
begin
  FTerminated := True;
end;

Es decir, que "lo único" que se lleva a cabo es dar a la variable privada "FTerminated" el valor "True". Como la propiedad "Terminated" del Hilo lee esta variable privada, pues eso, en cuanto ejecutes el procedimiento "Terminate" la propiedad "Terminated" valdrá "True",... y el bucle de ejemplo que anteriormente puso el compañero acabará, puesto que:

Código Delphi [-]
procedure TMyThread.Execute;
begin
  //inicializacion de objetos
  try
    while not Terminated do
    begin
      // haz lo que debas
    end;
  finally
    // liberacion/finalizacion de objetos
  end;
end;

Es decir, mientras la variable "Terminated" valga "False" el bucle continúa ejecuándose, empero, en cuanto esta valga "True" el bucle no se ejecutará más.

¿De dónde sacas tu Hilo? ¿Lo derivas de "TThread"? Porque, como digo, si es así, deberías contar con el método "Terminate" sin más, no tienes que implementarlo tú por tu cuenta.
__________________
David Esperalta
www.decsoftutils.com
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
Parar ejecucion en asp joel20 .NET 4 20-04-2006 11:44:30
parar bucle Cosgaya Varios 11 11-02-2006 16:01:56
rotar una imagen sin parar jarscuba Gráficos 4 14-03-2005 09:51:31
Como parar un programa en ejecucion??? damian2000 Varios 8 20-05-2004 01:56:26
parar un evento empty Varios 7 29-04-2004 13:08:17


La franja horaria es GMT +2. Ahora son las 12:33:09.


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