Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-03-2005
tortelini tortelini is offline
Registrado
 
Registrado: mar 2005
Posts: 6
Poder: 0
tortelini Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 07-04-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
Post 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
__________________
[Crandel]
Responder Con Cita
  #3  
Antiguo 07-04-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
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.
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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


La franja horaria es GMT +2. Ahora son las 15:20:10.


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