방금 내 자체 로깅 프레임 워크를 작성했습니다 (매우 가볍고 큰 로깅 프레임 워크 필요 없음). 인터페이스 ILogger와 그 인터페이스를 구현하는 여러 클래스로 구성됩니다. 하나의 질문에 대한 TGUILogger TStrings 로깅 대상으로 걸리고 목록 상자의 항목 멤버를 대상으로 사용할 수 있도록 주 스레드 로깅을 동기화합니다.로깅 및 동기화
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;
로깅이 작동하지만 응용 프로그램이 제대로 닫히지 않습니다. 클래스 유닛에 매달려있는 것 같습니다. 스택 추적 :
System.Halt0, System.FinalizeUnits, Classes.Finalization, Classes.FreeExternalThreads, System.TObject.Free, Classes.TThread.Destroy, Classes.TThread.RemoveQueuedEvents
내가 뭘 여기서 뭐라구?
편집 : 난 그냥이 메인 스레드에서 온 일부 로깅 요청 이후 정확히 내 문제가 될 수 TThread.StaticSynchronize
에 대한Warning: Do not call StaticSynchronize from within the main thread. This can cause
an infinite loop.
를 델파이 도움말의 다음 힌트를 발견했다. 이 문제를 어떻게 해결할 수 있습니까?
프로그램 초기화에서, 로깅 하위 시스템 호출 Windows API 함수 GetCurrentThreadID을 가지고 (주 스레드에서)에 결과를 저장 : 당신이 어떤 간단한 방법을 찾을 수없는 경우, 당신은이 일을 시도 할 수
필자는 주제에 답하고 싶지 않지만, 정말로 이것을 사용하여 가벼운 무게가 필요하면 다시 디자인하거나 상용 라이브러리를 사용하십시오. 이 코드는 많은 문제점을 가지고 있으며 가벼운 무게는 아닙니다. mj2008의 답은 올바른 방향으로의 첫 번째 전환점입니다. – mghie
재미 있군요, 그냥 오늘은 내 자신의 로깅 프레임 워크 (결국 실제 로깅을 할 SmartInspect를 사용하는)와 비슷한 것을 추가했습니다 .... – dummzeuch
당신은 무엇을 추가 했습니까? TGUILogger.Log()를 호출하여 교착 상태가 발생할 가능성이 없습니까? – mghie