Вы должны проверить Завершить в теме, чтобы это работало. Например:
procedure TMyThread.Execute;
begin
while not Terminated do begin
//Here you do a chunk of your work.
//It's important to have chunks small enough so that "while not Terminated"
//gets checked often enough.
end;
//Here you finalize everything before thread terminates
end;
С этим, вы можете позвонить
MyThread.Terminate;
И это будет прекратить, как только он закончит обработку другой кусок работы. Это называется «изящным завершением потока», потому что сам поток имеет возможность завершить любую работу и подготовиться к завершению.
Существует еще один способ, называемый «принудительное завершение». Вы можете позвонить:
TerminateThread(MyThread.Handle);
При этом Windows принудительно останавливает любые действия в потоке. Это не требует проверки «Прекращено» в потоке, но потенциально может быть чрезвычайно опасным, потому что вы убиваете поток в середине операции. После этого может произойти сбой приложения.
Вот почему вы никогда не используете TerminateThread, пока не убедитесь, что у вас есть все возможные последствия. В настоящее время вы этого не делаете, поэтому используйте первый метод.
спасибо Timo. Четкий ответ и примеры. – Dylan
И спасибо вам. очень хороший пример. – Dylan
Это может не только приложение, но и ресурсы, используемые thead, не будут освобождены. TerminateThread() - это вызов «экстремального отношения». – 2010-10-28 18:22:39