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)
-   -   Terminar y liberar Thread (https://www.clubdelphi.com/foros/showthread.php?t=25299)

eureka 19-09-2005 09:48:03

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.

delphi.com.ar 19-09-2005 14:03:39

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!


La franja horaria es GMT +2. Ahora son las 20:16:06.

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