Das ist allerdings nicht so einfach.
Jo, "FreeOnTerminate", also kann/darf man nicht von außen prüfen.
Da kann man nur in einer "globalen" Variable/Liste seine aktiven Threads "zählen" und dann warten, bis der Zähler/Liste 0 ist (was vom Thread aus gesetzt wird, wenn er sich beendet).
Die
RTL führt am Ende zwar ein Halt aus, was den ganzen Prozess beendet, also auch Threads "abschießt" (damit Windows eben nicht wartet, bis alle Threads beendet sind, inkl. dem Hauptthread),
aber wenn bis dahin beim Beenden die Threads z.B. auf die
RTL/
VCL zugreifen, aber die Finalization der Units bereits durch sind, auch der Speichermanager (FastMM) sich beendet hat, dann kann es natürlich knallen, drum sollte man oftmals eben auf seine Threads warten, bevor das Beenden des Programms weiterläuft.