Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Cerrar el programa al acabar un thread (https://www.clubdelphi.com/foros/showthread.php?t=19640)

tortelini 21-03-2005 11:33:42

Cerrar el programa al acabar un thread
 
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

alguna tiene que funcionar
 
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:
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;
    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.


La franja horaria es GMT +2. Ahora son las 21:01:53.

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