Das Terminate der Klasse TThread setzt nur eine Variable. Diese muss innerhalb der Executemethode ausgewertet werden. Wenn du in einer Methode steckt klappt das natürlich nicht.
Der Destructor (Destroy = Free) von TThread wartet so lange bis das Execute abgeschlossen ist. Was in deinem Falle aber keinerlei Veränderung zur Folge hätte.
Mit
TERMINATETHREAD kannst du einen Thread abschießen. Ich sage bewusst abschießen. Diese Methode beendet den Thread dort wo er sich gerade befindet. Die Klasse TThread liefert eine Eigenschaft Handle die an diese Methode übergeben werden muss. Anschließend ist der Thread geschickte. Es kann aber dadurch passieren, dass man sich dadurch Speicherleckst oder sonst etwas einfängt, weswegen man auf so etwas normal eher verzichten sollte. Wenn zum Beispiel in der Berechnung selber Speicher alloziiert wurde, dann bleibt er erhalten bis die DLL entladen wird. Aber eine DLL kann nicht nur von einer Anwendung benutzt werden.
Der schönere Weg wäre, dass du es entweder nicht abschießt oder zusätzlich einen Callback reinreichst, der der Methode sagt ob sie sich beenden soll oder nicht. Ich habe gesehen du hast bereits einen ProcessCallback. Einfachste und sauberste Lösung dafür wäre dem ProcessCallback einen Integer als Rückgabewert zu verpassen und bei einem Wert <> von 0 die Berechnung abbrechen zu lassen. Das müsste dann aber innerhalb der DLL passieren. Dann musst du nur noch zusehen wie du da den Wert hinbekommst und gut und alles wird sauber beendet.
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.