Klingt logisch und einfach. Ist es sicherlich auch, wenn mal mit Threads viel Erfahrung hat. Leider muß ich da noch viel lernen und die Umsetzung fällt einem dann nicht immer so leicht.
Das mit Assigned(TThread(Sender).FatalException) hab ich grad mal gar nicht verstanden.
Schau dir mal das OnTerminate-Event des TThread an. Das ist wie das OnClick der TButtons und im Sender steckt die Instand des angeklickten Buttons, also in diesem Fall natürlich die Instanz des beendeten Threads.
Ich weiß ja nicht wie ud wo die die Instanz deines Threads gespeichert hast, aber das ist ja egal, da der Sender immer passt und man die Instanz somit auch da auslesen kann.
Man muß halt nur das TObject in den richtigen Typen casten, wenn man das verwendet.
Ergebnis: Du erstellst dir eine passende Methode, rufst darin das Syncronize und auf darin dann den genannten Code.
Und nun natürlich nur noch das Event dem Thread zuweisen.
Delphi-Quellcode:
procedure TDeineForm
{oder dein TThread-Nachfahre}.MyThreadTerminate(Sender: TObject);
begin
// TThread(Sender).Synchronize nehm ich jetzt mal nicht, da der Thread ja eigentlich schon beendet ist
// und ich jetzt nicht genau weiß, ob was passieren könnte, auch wenn es vermutlich doch funktionieren könnte
TThread.Synchronize(
nil,
procedure
begin
if Assigned(TThread(Sender).FatalException)
then
ShowException(
Exception(TThread(Sender).FatalException),
nil);
end);
end;
PS: Wäre es nicht besser, wenn dein WriteLog im inneren prüft, ob es im Hauptthread läuft und sich notfalls selber synchroonisiert?
(oder notfalls einfach immer blind synchronisieren ... das Synchronize prüft das intern bestimmt auch selber nochmal)
Würde das Logging vereinfachen und so einige Codezeilen sparen.