Also wenn dein Thread nicht mit FreeOnTerminate := TRUE läuft, dann reicht ein einfaches DeinThread.Free im OnDestroy des Forms aus und alles wird korrekt beendet.
Genau
das möchte er doch vermeiden!
Aha, OK, hab's zu oberflächig gelesen. Aber der Anwender der Komponente muss doch etwas tun: Create und Free muss schon irgendwo im Code sein (ist ja kein TComponent-Nachkömmling). Und wenn FreeOnTerminate := FALSE ist, dann kann die oben genannte Zugriffsverletzung niemals entstehen.
Also man kann sich grundsätzlich niemals darauf verlassen, dass Sychronize erfolgreich ausgeführt wird, da man den Kontext aus dem Thread aus nicht kennen kann (und soll).