Da du im Execute keinerlei Exceptions verarbeitest, solltest du das dringend machen.
Try-Except drumrum und die
Exception anzeigen.
Tipp: TThread hat ein OnTerminate-Ereignis, welches du dringend mal implementieren solltest, da du Ersteres ja nicht machst.
Und da drin dann einfach
Delphi-Quellcode:
if Assigned(TThread(Sender).FatalException)
then
ShowException(
Exception(TThread(Sender).FatalException),
nil);
Und nicht vergessen, dieser ShowException-Aufruf muß natürlich mit der
VCL synchronisiert werden.
Ex gibt in der
Unit System zwar ein End-Thread-Event, aber wenn Dieses ausgeführt wird, dann kann die Thread-Instanz schon weg sein (FreeOnTerminate) und selbst wenn noch nicht, dann kommt man dort sowieso nicht an den Instanzzeiger.
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.
TThread fängt Exceptions ab, welche im TThread-Execute aufgetreten und durchgerauscht sind (von dir nicht abgefangen werden -> Try-Except)
und dann veröffentlicht es diese
Exception, über das Property FatalException, welches man im OnTerminate auslesen und anzeigen kann.
OnTerminate wird von TThread bereits mit der
VCL synchronisert (ist eigentlich voll blöd, daß es immer automatisch passiert, denn man braucht/will das nicht immer so haben), also kann man darin problemlos direkt die
Exception(MyThread.FatalException).Message
anzeigen/loggen, oder man verwendet den Fehlerdialog der
VCL (ShowException).
Windows beendet Programme (schießt sie hart ab), bei denen eine
Exception bis zur Wurzel (Windows) durchrauscht.
Drum sollte man auch immer die SysUtils einbinden, um die
Exception-Behandlung vom Delphi zu aktivieren.
Denn selbst wenn man eine kleine "billige"
DLL hat, in Welcher (in exportierter Prozedur) eine
Exception auftritt, dann würde Windows das Programm abschießen, da die
DLL (standardmäßig) nicht weiß, ob sie in einem Delphi-Programm geladen ist und ob sie nicht vielleicht dessen Fehlerbehandlung mit benutzten könnte. (siehe Delphi-
OH > Verwendung von DLLs)