Wenn du FreeOnTerminate gesetzt hast, dann wird der Speicher automatisch gelöscht. Dann brauchst du den nicht noch einmal per Hand freigeben. Wenn du weiß was da passiert wirst du merken, dass es sogar falsch ist den Speicher automatisch und direkt per Free freizugeben. Denn durch FreeOnTerminate wird nur der Speicher des Threads freigegeben. Aber der Inhalt des Speicher bleibt erhalten und die Instanz (FCompareThread) zeigt weiterhin auf diesen Speicher. Wenn du den Thread jetzt selber noch einmal mit Free freigeben willst, dann sieht das so aus ob der Thread noch existieren würde. Nur beim Löschen des Threads in Windows wird dann festgestellt "Hö. Moment mal. Den Thread gibs ja gar nicht mehr". Was wiederrum vollkommen berechtigt einen Fehler verursacht. Ist in etwas vergleichbar wie 2 aufeinander folgende Frees (nicht FreeAndNil). Denn das zweite Free würde auch noch mal versuchen die Instanz zu löschen.
Hoffe das hat dir den Hintergrund etwas erklärt. Also entweder FreeOnTerminate oder Free. Nie beides. Und wenn du FreeOnTerminate benutzen, dann solltest du aber keine Instanz von deinem Thread behalten. Denn alle Zugriffe die du machst können einen Fehler auslösen, wenn der Thread im Hintergrund schon gelöscht wurde. Zum Benachrichtigen bei der Beendigung eines Threads solltest du dann auch OnTerminate benutzen. Das entspricht auch eher dem Wesen der Threads.
_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.