PDA

Ver la Versión Completa : Cerrar el programa al acabar un thread


tortelini
21-03-2005, 11:33:42
Hola.
Tengo un programa en delphi 6 que al iniciarse arranca un thread paralelo de ejecución, y quiero que al terminar el thread se cierre toda la aplicación automáticamente. En un principio lo intenté con el siguiente código:

h: HWND;
h := FindWindow(nil, 'Interfaz');
if h <> 0 then PostMessage(h, WM_CLOSE, 0, 0);

siendo Interfaz el Caption del formulario único de la aplicación, pero me da el siguiente error:

Exception EAccessViolation in module Project1.exe at 00020667. ¿Qué hago mal?
¿De que otra forma podría finiquitar la aplicación desde el hilo? Muchas gracias

Crandel
07-04-2005, 21:33:30
Te tiro un par de ideas (no las probe)

1. Coloca la propiedad FreeOnTerminate en true. Cada cierto tiempo checkea el estado de la instancia del objeto si es igual a nil, si es asi terminas. No me acuerdo si se pone en nil en forma automatica cuando termina.

2. La propiedad FreeOnTerminate en el thread ponela en false.
Coloca una propiedad en el thread llamado Terminado: boolean, que cuando termine se ponga en verdadero.
Cada cierto tiempo checkeas el esta de la bandera. Si esta en true terminas el hilo y cerras la aplicación.

3. Para no tener que checkear el estado de nada, podes generar un evento desde el thread avisando que termino.

Alguna tiene que funcionar

Suerte

delphi.com.ar
07-04-2005, 22:26:18
Un ejemplito:

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;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
FThread: TMiThread;
procedure OnThreadTerminate(Sender: TObject);
public
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TMiThread }

procedure TMiThread.Execute;
begin
repeat
until Terminated;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
FThread.Terminate;
end;

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

procedure TForm1.OnThreadTerminate(Sender: TObject);
begin
{Aquí cierro el form, bien podría utilizar Application.Terminate}
Close;
end;

end.