Я использую потоки в своем проекте. И я хочу убить и немедленно прекратить нить.Не удается завершить потоки
образец:
type
test = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
var
Form1: TForm1;
a:tthread;
implementation
{$R *.dfm}
procedure test.Execute;
begin
Synchronize(procedure begin
form1.ProgressBar1.position := 0;
sleep(5000);
form1.ProgressBar1.position := 100;
end
);
end;
procedure TForm1.btn_startClick(Sender: TObject);
begin
a:=test.Create(false);
end;
procedure TForm1.btn_stopClick(Sender: TObject);
begin
terminatethread(a.ThreadID,1); //Force Terminate
end;
Но когда я нажимаю на btn_stop
(после нажатия на btn_start
), нить не остановится. Итак, как можно немедленно остановить эту тему?
BTW a.terminate;
не работал.
Спасибо.
Ваша основная тема спала в течение 5 секунд, поэтому вы не можете ожидать, что она что-то предпримет. Кроме того, существует разница между 'ThreadID' и' Handle'. Функция TerminateThread ожидает поток 'Handle', а не' ThreadID'. – TLama
@TLama 1) Если я закрою приложение за эти 5 секунд, как окна закрывают этот поток? 2) Это образец. Я не могу прекратить нить даже без «сна» ... И о вашем редактировании: «Как я могу это прекратить? И как я могу найти дескриптор потока? – Sky
Назовите его 'TerminateThread (a.Handle, 1);'. Вы проходили там «ThreadID», который отличается от «Handle». Но обратите внимание, что это неправильный путь для прекращения потоков. – TLama