Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-09-2005
eureka eureka is offline
Miembro
 
Registrado: sep 2005
Posts: 13
Poder: 0
eureka Va por buen camino
Terminar y liberar Thread

Hola a todos,

Tengo un proceso que debe cargar los datos de un archivo sobre una base de datos. He decidido realizar el proceso de carga en un Thread y mantener en el formulario principal una barra de progreso junto a un boton para cancelar ( reversionar la base de datos, rollback, etc... ) Me he topado con los tipicos problemas de "access violation", al hacer clic sobre cancelar, sin encontrar ninguna solucion

El codigo es

Código Delphi [-]
 procedure BtoCancelarClic();
 begin
 
     Thread.Suspend;
     if Desea Cancelar then
 
         begin
 
             Thread.FinThread();
             Thread.Resume;
 
         end
 
     else
 
         begin
 
             Thread.Resume;
 
         end;
 
 end;
 
 
 // Indicar la finalizacion
 procedure TThread.FinThread();
 begin
 
     fbEnd:= True;
 
 end;
 
 
 procedure TThread.Execute;
 var
 ...
 begin
 
     while not Eof(F) and bOk and not fbEnd do
 
         begin
 
             Application.ProcessMessages;
 
         ...
         end;
 
     if bOk and not fbEnd then
 
         fDatabase.Commit
 
     else
 
         fDatabase.Rollback;
 
 end;
 
 
 destructor TThread.Destroy();
 begin
 
     if fDatabase.InTransaction then fDatabase.Rollback;
     fDatabase.Close; fSession.Close;
     fDatabase.Free; fSession.Free;
     PostMessage(fOwnerHandle, WM_User + 1, Self.ThreadID, 0);
     inherited Destroy;
 
 end;
Espero ue aquellos que esten mas familiarizados con los procesos con hilos puedan sugerir alguna idea y/o consejo. Gracias por todo ello.

Última edición por dec fecha: 19-09-2005 a las 10:28:23. Razón: ¡¡Encerrar el código fuente entre las etiquetas [DELPHI] ... [/DELPHI]!!
Responder Con Cita
  #2  
Antiguo 19-09-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: 27
delphi.com.ar Va por buen camino
Yo utilizaría las funcionalidades de la clase TThread, en lugar de crear unas propias terriblemente similares, por ejemplo en lugar del método FinThread y la variable fbEnd, utilizaría Terminate y Terminated. Sacaría el Application.ProcessMessages para no mezclarme con el hilo de la VCL.
Por otro lado, cuando se ejecuta el Destroy, es muy posible que el hilo siga ejecutándose, por eso si liberas todos los objetos que utilizas en Execute, este te dará un access violation. Prueba cambiar el código que tienes en Destroy a OnTerminate, o DoTerminate.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
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


La franja horaria es GMT +2. Ahora son las 02:19: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