Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-06-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 23
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
ElGatitoTapatio,

Cita:
Empezado por ElGatitoTapatio
...Hilo a mi aplicación para realizar un proceso de copiado de archivos...el hilo se ejecuta correctamente...cuando cierro mi aplicacion me genera una excepcion...
Revisa este código:
Código Delphi [-]
constructor TEnviarTemporales.Create(EHandle:HWND; ThreadPriority: TThreadPriority);
begin
  
   inherited Create(False);

   // Establece la prioridad del hilo (tpNormal es el default).
   Priority := ThreadPriority;  

   Handle:= EHandle;

end;

procedure TEnviarTemporales.Execute;
begin

  // Indica que el hilo sera destruido de forma automática por el VCL cuando este finalize.
  FreeOnTerminate := True;

  // Verifica si el hilo se ha finalizado
  if not Terminated then
     Synchronize(EnviarDocumentos);

end;

function TEnviarTemporales.CopiarDocumentos(destino,ruta : String): Integer;
var
...
begin
...
   // Verifica si el hilo se ha finalizado
   if Not Terminated then
      Result:= ShFileOperation(F);
end;

procedure TEnviarTemporales.EnviarDocumentos;
var
...
begin
...
   for i := 0 to Listado.Count-1 do
   begin
      // Verifica si el hilo se ha finalizado
      if Terminated then Exit;
   ...
   end
...
end;

procedure Tfrm_main.FreeNewThread(Sender: TObject);
begin
   // Asegura que la instancia no tenga ninguna referencia
   HEnviarTemporales := nil;
end;

procedure Tfrm_main.EnviarTemporales;
begin
   if not Assigned(HEnviarTemporales) then
   begin

      HEnviarTemporales := TEnviarTemporales.Create(Handle, tpNormal);

      // Este procedimiento se ejecuta al finalizar el hilo
      HEnviarTemporales.OnTerminate := FreeNewThread;

   end
end;

// Si quieres finalizar el hilo en cualquie instante antes de su finalización
procedure Tfrm_main.EndNewThread;
begin
   // Envía una señal de finalización al hilo
   HEnviarTemporales.Terminate;
end
El código anterior sugiere un mecanismo de control para la finalización ordenada del hilo en función del problema planteado, sin embargo te sugiero probar lo indicado en el Msg #2 y hacer los ajustes que sean necesarios.

Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 01-06-2013 a las 00:29:45.
Responder Con Cita
  #2  
Antiguo 01-06-2013
ElGatitoTapatio ElGatitoTapatio is offline
Miembro
 
Registrado: nov 2006
Posts: 38
Poder: 0
ElGatitoTapatio Va por buen camino
nlsgarcia Gracias por los comentarios, de entrada me sirve para aprender mas sobre los hilos, por otra parte lo estaré probrando y les aviso.
Responder Con Cita
  #3  
Antiguo 01-06-2013
ElGatitoTapatio ElGatitoTapatio is offline
Miembro
 
Registrado: nov 2006
Posts: 38
Poder: 0
ElGatitoTapatio Va por buen camino
Bueno aqui estan mis conclusiones:

1.- Probé lo que me sugirió el compañero nlsgarcia, lamentablemente me siguió marcando error.
2.- Y pues me di a la tarea de ir comentando codigo y probando y llegué al problema, la funcion XDel. Esta funcion la estoy importando o tomando u oteniendo o como de se diga de una DLL que utilizo en mi proyecto, mi solucion fue sacar esa funcion de la dll y agregarla a la unidad del Hilo y efectivamente santo remedio.

Como no me gusta quedarme con la espinita dentro, alguien me podria explicar porque pasa esto cuando desde un hilo utilizo funciones de librerias externas? digo cosas tontas que se me ocurren es que al liberar el hilo se libere la dll o algo asi, pero ustedes son los expertos. Alguien sabe la respuesta?

Como comentario quiero decir que tambien probe utilizando mas funciones de la dll y efectivamente cuando hago esto es cuando me sucede el error.

Agrego la funcion solo como +info.

Código Delphi [-]
...
type
  TEnviarTemporales = class( TThread )
  private
    Handle : HWND;
  protected
    function  CopiarDocumentos(destino,ruta : String): Integer;
    function  XDel(From: TStrings): integer;
    procedure EnviarDocumentos;
    procedure Execute; override;
  public
    constructor Create(EHandle:HWND; ThreadPriority: TThreadPriority);
  end;

...

// ++ Elimna una lista de archivos
function TEnviarTemporales.XDel(From: TStrings): integer;
var
  FS: SHFILEOPSTRUCT;
  SFrom: string;
begin
  Result:= -1;
  if(From.Count > 0) then
  begin

    SFrom:= StringReplace(From.Text, #13+#10, #0, [rfReplaceAll]);

    ZeroMemory(@FS, sizeof(SHFILEOPSTRUCT));
    FS.wnd:= Handle;
    FS.wFunc:= FO_DELETE;
    FS.pFrom:= PCHAR(SFrom + #0);
    FS.pTo:= nil;
    FS.fFlags:= FOF_NOCONFIRMATION;

    Result:= SHFileOperation(FS);
  end;
end;


Y les agradeszo nuevamente por su valiosa ayuda!
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Aplicacion Delphi lanza Excepcion 0x0eedfade Sieg Varios 4 29-07-2010 14:10:21
Cómo cerrar otra aplicacion desde mi aplicacion en Delphi 7 Gaby123 API de Windows 5 04-01-2007 22:44:51
Aplicacion con varios Hilos de Ejecución samantha jones Varios 1 02-03-2005 17:27:24
Cerrar Aplicacion Nathan API de Windows 3 22-03-2004 19:03:43


La franja horaria es GMT +2. Ahora son las 17:29:12.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi