Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como detengo un Hilo (https://www.clubdelphi.com/foros/showthread.php?t=26637)

Luis Castillo 28-10-2005 17:13:23

Como detengo un Hilo
 
Hola colegas....

Tengo una forma que ejecuta una consuta por medio de un hilo.....debido a que los datos de la tabla pueden llegar a ser muy numerosos...

Pero quiero poner un boton que permita al usuario detener la busqueda....

Me podrian informar algo?

delphi.com.ar 28-10-2005 17:18:14

¿El procedimiento que ejecuta el hilo lo has creado vos?... Lo normal sería ejecutar el método Terminate, pero para esto es necesario que el código que se este ejecutando "se preocupe" por verificar el estado de la variable FTerminated, y si esta es True, que cancele la ejecución!

http://www.clubdelphi.com/foros/showthread.php?t=25299

Saludos!

Luis Castillo 28-10-2005 17:23:43

Hilo
 
Pues .....si el procedimiento lo hice yo....

El hilo solo abre la consulta con unos parametros....y yo lo que hago es decier Query.open

Como es eso que el codigo se preocupe por la verificacion de la variable FTErminated. Porque creo que no es asi....

delphi.com.ar 28-10-2005 17:38:09

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
 TMiThread = class(TThread)
  protected
    procedure Execute; override;
  end;

TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    FThread: TMiThread;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TMiThread }

procedure TMiThread.Execute;
begin
  repeat
    { Código en ejecución }
  until Terminated;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  { Le envía la señal para que el hilo termine correctamente }
  FThread.Terminate;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  { Mata el hilo forzosamente }
  TerminateThread(FThread.Handle, 0);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  FThread := TMiThread.Create(True);
  FThread.FreeOnTerminate := True;
  FThread.Resume;
end;

end.

Si el hilo creó un DataSet, y lo matas abruptamente, el hilo no se encargará de cerrar y liberar este DataSet. Es mas, es muy posible que la consulta se siga ejecutando en el servidor. Solo imagina lo que puede producir que varios usuarios cancelen reiteradamente consultas de este tipo.
Yo analizaría si tu herramienta de conexión y tu servidor soportan consultas asincrónicas.

Saludos!

Luis Castillo 28-10-2005 17:49:38

Muy bien....
 
Huy....te agradezco esa explicacion tan detallada y precisa,....vamos a ver si puedo decirte algo...

En el Execute tu pones un procemiento que es el que toma el tiempo. Sin embargo mi proceso es solo este:

...
query.open
...

Creo que debo utilizar un hilo porque puede tener muchos registros. Si es asi, no puedo verificar Terminated como tu lo haces en el REPEAT ... UNTIL

NOTA...
yo estoy trabajando en Paradox.....y localmente...

Muchisimas gracias....

delphi.com.ar 28-10-2005 17:52:59

Fíjate en mi explicación que hay dos formas de terminar un hilo, por las buenas con Terminate, y por las malas con TerminateThread. Vos estas buscando la segunda, yo no lo sugiero, pero bué!

Luis Castillo 28-10-2005 18:02:29

entendido
 
ok .....ya lo vi.

Pero tambien es claro lo que yo hago....sobre que el proceso es solo una linea: abrir una consulta. Y obviamente quiero hacer esto de la mejor manera....


TU QUE HARIAS.....

Muchas gracias.....

PD: ya que tu estas conectado....no sepuede ir a un chat?

delphi.com.ar 28-10-2005 18:06:34

Cita:

Empezado por Luis Castillo
TU QUE HARIAS.....

Lo que sugerí anteriormente:
Cita:

Empezado por Delphi.com.ar
Yo analizaría si tu herramienta de conexión y tu servidor soportan consultas asincrónicas.

Desconozco Paradox como para poder seguir guiándote.

Saludos!

jachguate 28-10-2005 19:09:51

Cita:

Empezado por Luis Castillo
PD: ya que tu estas conectado....no sepuede ir a un chat?

Esto se convertiría en un servicio técnico, del que el resto de la comunidad no obtendría ningún beneficio. Te invito a leer la guia de estilo (link en mi firma) y recordar que nuestra regla general es: Un tema público se mantendrá público. De esa manera, hemos logrado una base de datos de mas de 170,000 mensajes, entre los foros actuales y los antiguos (sin tomar en cuenta unos 25,000 que, según recuerdo, se perdieron de los mas antiguos. :D)

Saludos.

;)

Ainbazter 23-03-2007 14:51:35

Tengo exactamente el mismo problema, ¿como lo resolvisteis finalmente?


La franja horaria es GMT +2. Ahora son las 23:00:58.

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