Вы должны прекратить поток самостоятельно (скажите, чтобы он прекратился).Одним из способов является использование процедуры завершения потока, но вы должны проверить это в методе выполнения потока.Примерно так:
procedure Execute;
begin
inherited;
while not Terminated do
begin
// do your job
end;
end;
procedure TForm1.StopThread;
begin
MyThread.Terminate;
// wait and block until the scheduling thread is finished
AResult := WaitForSingleObject(MyThread.Handle, cShutdownTimeout);
// check if we timed out
if AResult = WAIT_TIMEOUT then
TerminateThread(MyThread.Handle, 0);
end;
Или вы можете использовать встроенную сигнализацию в окнах, чтобы вам не пришлось зацикливаться.может использовать WaitForMultipleObjects и освободить ожидание в различных условиях.Я использовал WaitForSingleObject, чтобы не усложнять вещи многим.
Также обязательно установите "FreeOnTerminate: = True" в конструкторе потоков.Ох, и жесткое завершение в конце не является обязательным, конечно.Это может быть опасно.Вы сами лучше знаете, будете ли вы использовать это или нет.Вы также можете подождать более длительный или бесконечный период, если уверены, что поток в конце концов остановится.