Logging y sincronización
Acabo de escribir mi propio marco de registro (muy ligero, sin necesidad de un gran marco de registro). Consiste en una interfaz ILogger y una serie de clases que implementan esa interfaz. Sobre el que tengo una pregunta es sobre TGUILogger, que toma un TStrings como el objetivo de registro y sincroniza el registro con el hilo principal para que el miembro Elementos de un cuadro de lista pueda usarse como el objetivo.
type
ILogger = Interface (IInterface)
procedure Log (const LogString : String; LogLevel : TLogLevel);
procedure SetLoggingLevel (LogLevel : TLogLevel);
end;
type
TGUILogger = class (TInterfacedObject, ILogger)
public
constructor Create (Target : TStrings);
procedure Log (const LogString : String; LogLevel : TLogLevel);
procedure SetLoggingLevel (LogLevel : TLogLevel);
private
procedure PerformLogging;
end;
procedure TGUILogger.Log (const LogString : String; LogLevel : TLogLevel);
begin
TMonitor.Enter (Self);
try
FLogString := GetDateTimeString + ' ' + LogString;
TThread.Synchronize (TThread.CurrentThread, PerformLogging);
finally
TMonitor.Exit (Self);
end;
end;
procedure TGUILogger.PerformLogging;
begin
FTarget.Add (FLogString);
end;
El registro funciona, pero la aplicación no se cierra correctamente. Parece colgar en la unidad de clases. El seguimiento de la pila:
System.Halt0, System.FinalizeUnits, Classes.Finalization, Classes.FreeExternalThreads, System.TObject.Free, Classes.TThread.Destroy, Classes.TThread.RemoveQueuedEvents
¿Qué estoy haciendo mal aquí
EDIT: acabo de encontrar la siguiente pista en la ayuda de Delphi para TThread.StaticSynchronize
Warning: Do not call StaticSynchronize from within the main thread. This can cause
an infinite loop.
Esto podría ser exactamente mi problema, ya que algunas solicitudes de registro provienen del hilo principal. ¿Como puedo resolver esto