Читайте матчасть или смотрите исходники компонентов.
Вот исходный код метода Terminate класса TThread:
procedure TThread.Terminate;
begin
FTerminated := True;
end;
То есть все что он делает - это устанавливает свойство Terminated в True.
К примеру, поток:
procedure TMyThread.Execute;
begin
while True do
begin
Sleep(100);
end;
Terminate; // Не советуют так делать
end;
будет крутиться бесконечно до закрытия процесса.
Даже если вызвать Terminate вне потока - он все равно не завершится.
А вот код:
procedure TMyThread.Execute;
begin
while not Terminated do
begin
Sleep(100);
end;
end;
При вызове Terminate возможно завершит поток, если в коде самого потока не происходит какая то длительная операция или он вообще по каким то причинам завис.
Чтобы убедиться, что поток завершен, есть в классе TThread метод WaitFor, но и его использовать я бы не рекомендовал, потому что процесс или поток его вызвавший, будет стоять в ожидании завершения потока, а если поток завис?
В данном случае лучше юзать штатные средства Windows - WaitForSingleObject
MyThread.Terminate;
if WaitForSingleObject(MyThread.Handle, 1000) <> WAIT_OBJECT_0 then //ждем секунду
TerminateThread(MyThread.Handle, 0); //убиваем поток принудительно