Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Los mejores trucos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-03-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Crear archivo log

Esta funcion nos permite crear un archivo .log

Código Delphi [-]
procedure log(Mensaje: String);
var
  F: TextFile;
  Filename: String;
  SearchRec: TSearchRec;
begin
  // Damos formato al mensaje
  Mensaje:= FormatDateTime('[ddd dd mmm, hh:nn] ', Now) + Mensaje;
  Filename:= ChangeFileExt(ParamStr(0),'.log');
  if FindFirst(Filename,faArchive,SearchRec) = 0 then
  begin
    // Comprobamos el tamaño de .log
    if SearchRec.Size > (1024*1024) then
      // Y si es mayor de 1 MB lo movemos
      MoveFileEx(PChar(Filename),PChar(Filename + '.1'),
        MOVEFILE_REPLACE_EXISTING);
    FindClose(SearchRec);
  end;
  // Aqui abrimos el archivo si existe, o lo creamos sino existe
  AssignFile(F, Filename);
  {$I-}
    Append(F);
  if IOResult <> 0 then
    Rewrite(F);
  {$I+}
  if IOResult = 0 then
  begin
    // Escribimos el mensaje
    Writeln(F,Mensaje);
    CloseFile(F);
  end;
end;

// Ejemplo de uso
log('Se inicio la aplicacion');

Hay que tener en cuenta que esta función no es "thread-safe", es decir, si nuestra aplicación tiene varios threads y mas de uno intenta usar la función a la vez, la función puede fallar.

Una posible solución es usar TCriticalSection. Para eso tenemos que declarar una variable global del tipo TCriticalSection. La función modificada quedaría así:
Código Delphi [-]
var
  CriticalSection: TCriticalSection;

// Esta funcion nos permite guardar mensajes en un .log
procedure log(Mensaje: String);
var
  F: TextFile;
  Filename: String;
  SearchRec: TSearchRec;
begin
  // Damos formato al mensaje
  Mensaje:= FormatDateTime('[ddd dd mmm, hh:nn] ', Now) + Mensaje;
  Filename:= ChangeFileExt(ParamStr(0),'.log');
  // Comenzamos el bloqueo
  CriticalSection.Enter;
  try
    if FindFirst(Filename,faArchive,SearchRec) = 0 then
    begin
      // Comprobamos el tamaño de .log
      if SearchRec.Size > (1024*1024) then
        // Y si es mayor de 1 MB lo movemos
        MoveFileEx(PChar(Filename),PChar(Filename + '.1'),
          MOVEFILE_REPLACE_EXISTING);
      FindClose(SearchRec);
    end;
    // Aqui abrimos el archivo si existe, o lo creamos sino existe
    AssignFile(F, Filename);
    {$I-}
      Append(F);
    if IOResult <> 0 then
      Rewrite(F);
    {$I+}
    if IOResult = 0 then
    begin
      // Escribimos el mensaje
      Writeln(F,Mensaje);
      CloseFile(F);
    end;
  finally
    // Terminamos el bloqueo
    CriticalSection.Leave;
  end;
end;


// ...


// En la seccion initialization y finalization de la unit
initialization
  CriticalSection:= TCriticalSection.Create;
finalization
  CriticalSection.Free;  
end.

Ahora nuestra función ya es "thread-safe". Pero podemos darle otra vuelta de rosca, y volver a meter todo el código dentro de la función. De esta manera ya no tendremos que preocuparnos de declarar variables globales.
Código Delphi [-]
procedure log(Mensaje: String);
var
  F: TextFile;
  Filename: String;
  Mutex: THandle;
  SearchRec: TSearchRec;
begin
  // Damos formato al mensaje
  Mensaje:= FormatDateTime('[ddd dd mmm, hh:nn] ', Now) + Mensaje;
  Filename:= ChangeFileExt(ParamStr(0),'.log');
  // Comenzamos el bloqueo
  Mutex:= CreateMutex(nil,TRUE,
    PChar(StringReplace(ParamStr(0),'\','/',[rfReplaceAll])));
  WaitForSingleObject(Mutex, INFINITE);
  try
    if FindFirst(Filename,faArchive,SearchRec) = 0 then
    begin
      // Comprobamos el tamaño de .log
      if SearchRec.Size > (1024*1024) then
        // Y si es mayor de 1 MB lo movemos
        MoveFileEx(PChar(Filename),PChar(Filename + '.1'),
          MOVEFILE_REPLACE_EXISTING);
      FindClose(SearchRec);
    end;
    // Aqui abrimos el archivo si existe, o lo creamos sino existe
    AssignFile(F, Filename);
    {$I-}
      Append(F);
    if IOResult <> 0 then
      Rewrite(F);
    {$I+}
    if IOResult = 0 then
    begin
      // Escribimos el mensaje
      Writeln(F,Mensaje);
      CloseFile(F);
    end;
  finally
    ReleaseMutex(Mutex);
    CloseHandle(Mutex);
  end;
end;

Vaya forma de darle vueltas al asunto ... jejeje
Responder Con Cita
  #2  
Antiguo 22-03-2007
Avatar de PabloTech
PabloTech PabloTech is offline
Miembro
 
Registrado: ene 2007
Ubicación: Tucumán, Argentina
Posts: 82
Poder: 18
PabloTech Va por buen camino
Esta muy bien. Sobre todo porque salva los movimientos hasta el punto donde se produzca la interrupción no deseada del programa en ejecución.
Responder Con Cita
  #3  
Antiguo 09-05-2008
cyber_zero cyber_zero is offline
Miembro
 
Registrado: abr 2008
Posts: 22
Poder: 0
cyber_zero Va por buen camino
Buenos dias disculpa la ignorancia pero como lo puedo usar, me interesa muchisimo, pero no pudo hacerlo funcionar, te agradeceria si me pudieran ayudar, gracias de antemano
Responder Con Cita
  #4  
Antiguo 09-05-2008
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
¿Que error te da cyber_zero? Solo tienes que añadirla a tu código y llamarla desde donde quieras.

Para una versión actualizada de esta función echale un vistazo a este enlace:
http://delphi.jmrds.com/?q=node/37
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


La franja horaria es GMT +2. Ahora son las 00:53:24.


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