Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-05-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
No termina ejecución Programa principal al usar un Thread

Hola amigos !

He implementado en mi formulario principal un Thread de la siguiente forma :

Código Delphi [-]
type
  TMainform = class(TForm)
  ....
  TMyThread = class(TThread)
  protected
    procedure Execute; override;
  public
  end;

var
  Mainform : TMainform;
 
implementation
 
uses ....

{$R *.nfm}
 
var
  MyThread : TMyThread;

procedure TMainform.Button1Click(Sender: TObject);
begin
  MyThread := TMyThread.Create(False);
  MyThread.FreeOnTerminate := True;
end;
 
procedure TMainform.Button2Click(Sender: TObject);
begin
  MyThread.Terminate;
end;

procedure TMyThread.Execute;
begin
 
  repeat
    ....
    Sleep(600000);  // 10 Minutes
 
  until Terminated;
 
end;

Lo que me pasa es que al intentar terminar mi aplicación, no se cierra la aplicación.

Si lo hago desde el propio Delphi, compilo y ejecuto la áplicación, al intentar terminarla se me queda el Delphi en modo 'de ejecución' y tengo que pulsar el botón Reset para terminar la aplicación.

Si ejecuto la aplicación desde Windows, parece que se cierra, pero algo queda abierto ya que si intento recompilar, el propio Delphi me dice que el EXE de la aplicación está en uso y no se puede escribir.

Qué estoy haciendo mal ?

Gracias y saludos a todos.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #2  
Antiguo 05-05-2007
Avatar de droguerman
droguerman droguerman is offline
Miembro
 
Registrado: abr 2005
Ubicación: tierra
Posts: 999
Poder: 20
droguerman Va por buen camino
y porque no terminas la hebra antes de cerrar tu aplicacion?
__________________
self.free;
Responder Con Cita
  #3  
Antiguo 06-05-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Lo tengo previsto de esa manera, antes de cerrar la aplicación, terminar el Thread.

Pero al no funcionarme, lo hice para que pudiera comprobar el proceso con dos botones, uno para comenzar el Thread, y otro para terminarlo. Ni siquiera así parece ser que lo hace correctamente, ya que al intentar salir de la aplicación principal, después de haber pulsado el boton que me termina el Thread, se queda 'colgada' la aplicación principal y en modo debug del Delphi tengo que pulsar el 'Reset' para terminar la aplicación principal.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #4  
Antiguo 06-05-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Ya he detectado el origen del problema.

Resulta que al hacer un Terminate del Thread, realmente no lo está 'cancelando' o 'abortando' en el proceso que se encuentre en ese momento, que precisamente es el Sleep(600000) en mi caso (10 minutos).

He bajado el tiempo de Sleep a 30 segundos, y si paro el proceso y salgo de la aplicación, al cabo de máximo 30 segundos se termina correctamente la aplicación principal.

Investigaré por ese punto y ya informaré.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #5  
Antiguo 06-05-2007
Avatar de droguerman
droguerman droguerman is offline
Miembro
 
Registrado: abr 2005
Ubicación: tierra
Posts: 999
Poder: 20
droguerman Va por buen camino
para evitar ese cuelgue quizás puedas editar tu hebra de la siguiente forma:
Código Delphi [-]
type
  TMainform = class(TForm)
  ....
  TMyThread = class(TThread)
  private
    ejecutar: integer; 
  protected
    procedure Execute; override;
  public
  end;

....
Código Delphi [-]

procedure TMyThread.Execute;
begin
 
  repeat
    ....
    if ejecutar=10 then
    begin
       //aqui pones tu código 
       ejecutar := 0;  
    end
    else
       ejecutar := ejecutar +1; 
    Sleep(6000);  // 1 Minute
 
  until Terminated;
 
end;
__________________
self.free;
Responder Con Cita
  #6  
Antiguo 06-05-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Gracias por tu ayuda.

Ya conseguí solucionar el problema. La solución completa está aqui.

Al final incluí un TTimer y hago uso de la propiedad Tag de dicho Timer para comprobar si debo ejecutar el Thread.
__________________
Piensa siempre en positivo !
Responder Con Cita
Respuesta



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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Modularizar el programa principal byivan Varios 21 18-01-2007 00:55:22
Thread bendito thread...se me pierde la ventana Seba.F1 API de Windows 5 02-02-2006 00:16:30
Cerrar el programa al acabar un thread tortelini API de Windows 2 07-04-2005 22:26:18
Ejecucion de un programa en una PC silviodp Varios 3 23-01-2004 01:53:09
programa en ejecucion??? Tanix Varios 2 11-12-2003 14:15:39


La franja horaria es GMT +2. Ahora son las 04:50:25.


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