Jo, das ist korrekt. Ich habe es allerdings also globale Methode bzw. als Klassenmethode. Dazu kommt dann die CriticalSection als Klassenvariable des LogControllers. Und hier die beiden "InteralLog"-Methoden:
Delphi-Quellcode:
procedure TLogController.DoAfterWrite(const ALogRecord: TLogRecord);
begin
FCriticalSection.Enter();
try
// save record for synchronized call
FSyncAfterWriteLogRecord := ALogRecord;
// synchronized call of event listener
if (GetCurrentThreadId() = System.MainThreadID) then
SyncDoAfterWrite()
else
Synchronize(SyncDoAfterWrite);
finally
FCriticalSection.Leave();
end;
end;
procedure TLogController.SyncDoAfterWrite();
var
i : Integer;
mt : PMethod;
begin
for i := 0 to FOnWriteLogListener.Count - 1 do
begin
mt := FOnWriteLogListener[i];
if ((Assigned(mt)) and (Assigned(mt))) then
begin
try
// call method
TOnAfterWrite(mt^)(FSyncAfterWriteLogRecord);
except
{$MESSAGE 'Baustelle'}
end;
end;
end;
end;
Und genau das Synchronize macht das Problem, so wie ich beschrieben habe -> Deadlock.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)