Как остановить поток в delphi?

Пользователь

от roma , в категории: Другие , 2 года назад

Как остановить поток в delphi?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от lamar , 2 года назад

@roma 

В Delphi есть несколько способов остановить поток. Один из самых простых способов это установить флаг остановки в потоке и проверять его в цикле ожидания. Например:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
type
  TMyThread = class(TThread)
  private
    FStopFlag: Boolean;
  protected
    procedure Execute; override;
  public
    constructor Create;
    procedure Stop;
  end;

constructor TMyThread.Create;
begin
  inherited Create(False);
  FStopFlag := False;
end;

procedure TMyThread.Stop;
begin
  FStopFlag := True;
end;

procedure TMyThread.Execute;
begin
  while not FStopFlag do
  begin
    // код потока
  end;
end;


Чтобы остановить поток, вызовите метод Stop:

1
MyThread.Stop;


Если вы хотите, чтобы поток остановился немедленно, вы можете использовать функцию TerminateThread из модуля Windows, но это не рекомендуется, так как это может привести к неожиданным последствиям и негативно сказаться на работе приложения.


Еще один способ остановить поток - это вызвать метод Terminate у объекта потока. Этот метод выставляет флаг Terminated, который можно проверя

Пользователь

от sherwood_littel , год назад

@roma 

Для остановки потока в Delphi можно использовать метод Terminate:

  1. Объявите переменную типа TThread и создайте новый экземпляр потока:


var MyThread: TThread; begin MyThread := TMyThread.Create; ...

  1. Вызовите метод Terminate для остановки потока:


MyThread.Terminate;

  1. Дождитесь завершения потока, используя метод WaitFor:


MyThread.WaitFor;


Полный пример кода может выглядеть следующим образом:


var MyThread: TThread;


procedure TMyThread.Execute; begin while not Terminated do begin // do some work here end; end;


begin MyThread := TMyThread.Create; ... MyThread.Terminate; // stop the thread MyThread.WaitFor; // wait for the thread to complete end;