Du mischst hier 2 Sperr-Funktionen, welche sich gegenseitig behindern können,
was eigentlich keine Probleme verursachen muß,
allerdings nur, wenn die Reihenfolge andersrum ist.
Synchronize sperrt einen ganzen Thread, wärend die CriticalSection nur eine Funktion sperrt.
Also erst Synchronize und darin dann die CriticalSection (wobei man sich die CS dann auch ganz sparen kann), das würde gehn und nicht in deinem Deadlock enden.
Also entweder di synchronisierst/sperrst nur über Synchronize
oder du darfst nicht beide Vaianten verschachteln.
Bei deinem DoAfterWrite darfst du z.B. innerhalb des Synchronize-Aufrufs nicht auf das FCriticalSection zugreifen, denn wenn dieses in einem anderem Thread gesperrt wurde, dann weiß das synchronisierte FCriticalSection (innerhalb von Synchronize) nicht, daß es eigentlich zum selben Abarbeitungspfad gehört, und sperrt natürlich, da es ja nun zu einem anderem Thread gehört.
sowas würde aber gehn.
Delphi-Quellcode:
procedure TLogController.DoAfterWrite(const ALogRecord: TLogRecord);
begin
FCriticalSection.Enter();
try
...
finally
FCriticalSection.Leave();
end;
Synchronize(SyncDoAfterWrite);
end;
PS: dieses
if (GetCurrentThreadId() = System.MainThreadID) then
macht Synchronize intern auch.