Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Parar un hilo de ejecución (https://www.clubdelphi.com/foros/showthread.php?t=37510)

deivi 15-11-2006 13:50:22

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.

oscarnoe 15-11-2006 14:10:17

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;

deivi 20-11-2006 09:36:22

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.

dec 20-11-2006 09:59:12

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? ;)

oscarnoe 20-11-2006 10:35:33

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

deivi 21-11-2006 13:24:51

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?

dec 21-11-2006 13:36:49

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.


La franja horaria es GMT +2. Ahora son las 08:56:00.

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