PDA

Ver la Versión Completa : TThread y cerrar una ventana previamente abierta


gluglu
14-05-2007, 18:58:44
Hola compañeros !

Al final, por más que lo intento no lo consigo, y solicito de vuestra ayuda.

Estoy intentando mandar correos electrónicos mediante un Thread.

Todo funciona en principio bien. Tengo una duda que no puedo resolver.

En mi pantalla de edición del correo, al darle al botón de enviar, ejecuto :
MainForm.ShowMailProcess;

que a su vez llama al siguiente proceso del MainForm que contiene además :
unit Main;
...
type
TMainform = class(TForm)
...
private
{ Private declarations }
MainMail : TMainFormMail;
...

TEMails = class(TThread)
protected
procedure Execute; override;
end;

var
Mainform : TMainform;
EMails : TEmails;

implementation
...

procedure TMainForm.ShowMailProcess;
begin

MainMail := TMainFormMail.Create(Self);
MainMail.Show;

EMails := TEMails.Create(False);
EMails.FreeOnTerminate := True;

end;

procedure TEMails.Execute;
begin
try
while not Terminated do begin
...
if DM0.IBDataSetEMails.Eof then begin
MainForm.MainMail.Free;
Terminate;
end
else begin
...
MainForm.MainMail.Send_EMail;
...
end;
end;
except
on E: Exception do begin
MainForm.Label1.Caption := E.Message;
end;
end;
end;


En resumidas cuentas : Al darle al botón de enviar correo, creo un form adicional (MainMail) que me va a mostrar el proceso del envío. Después de crear este form, creo el Thread de tal manera que se ejecute inmediatamente.

El Thread entra en un bucle que comprueba todos los correos que tiene que enviar. Una vez que no queden correos por enviar, quiero finalizar tanto el Thread como además cerrar y liberar la ventana creada para mostrar el proceso de envío.

Pero al intentar cerrar la ventana MainForm.MainMail.Free me salta un error : 'System Error. Code : 5'.

No sé como hacerlo para que libera la ventana que muestra el proceso y termine el thread.

Muchas gracias por vuestra ayuda

gluglu
14-05-2007, 19:19:54
Como siempre pasa en estas ocasiones, después de tantas horas probando, y justo después de decidirme a abrir un hilo con mi problema, te viene la idea y la solución : :o

procedure TEMails.Execute;
begin

try
while not Terminated do begin
if DM0.IBDataSetEMails.Eof then
Terminate
end
else begin
...

procedure TMainForm.ShowMailProcess;
begin

MainMail := TMainFormMail.Create(Self);
MainMail.Show;

EMails := TEMails.Create(False);
EMails.OnTerminate := TerminateEMail;
EMails.FreeOnTerminate := True;

end;

procedure TMainForm.TerminateEMail(Sender: TObject);
begin
MainMail.Free;
end;


Espero que le pueda servir el código a alguien más.

Saludos a todos ;)