Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#25

AW: For-Schleife im Thread wird nur einmal abgearbeitet

  Alt 19. Aug 2014, 15:32
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)
$2B or not $2B

Geändert von himitsu (19. Aug 2014 um 15:37 Uhr)
  Mit Zitat antworten Zitat