Hi!
Matze: ich greife nur aus dem OnTerminate-Ereignis auf die
VCL zu und das ist laut Delphi v.a. der Sinn der Sache, denn der Code wird im
VCL-Kontext aufgerufen und Zugriffe auf die
VCL usw. sind von dort aus sicher.
ABER.. HA! .. nach 6 Tagen Nervenzusammenbruch habe ich den Fehler gefunden:
Im OnTerminate-Ereignis darf man NICHT den Thread freigeben!
Ich habe das "FreeOnTerminate" Property auf false gesetzt und bin davon ausgegangen, dass ich "aus dem
VCL-Kontext" (lt. Hilfe) dann am Ende den Thread freigeben kann, nachdem ich die nötigen Daten herausgezogen habe.
Offensichtlich kam es NACH (!) meiner Prozedur dann in der SYSTEM-
Unit zu einer EAccessViolation-
Exception. Zumindest oft, aber nicht immer. Bei meinen vielen Tests kam die
Exception mal früher, mal später und je nach PC garnicht.
Die Lösung ist also DOCH "FreeOnTerminate" zu setzen, denn das OnTerminate-Event tritt noch vor Destroy() auf und so ist so oder so der Zugriff auf den Thread noch möglich. Nach der Prozedur wird der Thread freigegeben und gelöscht.
Offensichtlich wird intern so einiges mit Messages macht. Ein "thread.free" heisst noch LANGE nicht, dass danach alles freigegben wurde. Die Fassade, die Delphi einem hier bietet ist hier also recht brüchig.
Die Onlinehilfe ist hier zu schwammig - allerdings arbeite ich ja "noch" mit Delphi 6.
Da steht, dass man um auf den Thread zugreifen zu können immer "FreeOnTerminate" auf false setzen muss, denn sonst könnte schon nach dem nächsten Befehl der Thread abgearbeitet und entfernt sein.
Das habe ich gemacht und da "OnTerminate" ja im
VCL-Kontext ausgeführt werden sollte (lt. Hilfe) habe ich den Thread dann dort auch freigegeben.
Das war quasi ein Missverständnis.
Offenbar gehört selbst das OnTerminate()-Ereignis zum Thread und dann kracht es... je nach timing früher oder später.
Soweit meine Theorie.
Der ProcessExplorer von SysExternals hat mir hier gute Dienste erwiesen!
Tschüss
/\/\arcus (endlich wirklich happy!)