Проверить поток на существование

Shouldercannon

Well-Known Member
25.05.2010
128
0
29
Пенза
#1
Реализация
Код:
procedure TFormMain.BStartClick(Sender: TObject);
begin
  MyThread := TMyThread.Create(True); // После создания поток остановлен
  MyThread.FreeOnTerminate := True; // После завершения работы поток "умрёт" сам
  MyThread.Start; // Запуск потока
end;

procedure TMyThread.Execute;
var
  I2: Integer;
begin
  for I2 := 0 to 60 do
  begin
    if I2 > 61 then Break;
    Sleep(100);
    I := I2;
    Synchronize(SyncProc);
  end;

  Terminate; // Не советуют так делать
end;

procedure TMyThread.SyncProc;
begin
  FormMain.Caption := IntToStr(I);
end;

procedure TFormMain.BCheckClick(Sender: TObject);
begin
  // Проверка на существование потока
  if MyThread <> nil then
  begin
    // Если поток умирает "мирно", штатно завершив работу
    if MyThread.Terminated then ShowMessage('Поток "MyThread" не работает') else ShowMessage('Поток "MyThread" работает');
  end else ShowMessage('Поток "MyThread" не создан');
end;
В Execute потока есть вызов Terminate; благодаря чему проверка проходит нормально (Поток "MyThread" не работает), но делать так не советуют. Как правильно реализовать задуманное?
 

-master-

Well-Known Member
14.01.2012
616
20
#2
Потому что переменная MyThread нигде не принимает значения nil, следовательно можно нарваться на исключение.
Другими словами проверка if MyThread <> nil then не имеет смысла.

А правильность зависит от того что вы делаете, и для чего вам эта проверка.
Как правило FreeOnTerminate выставляют когда особо не заботятся о то что потом будет с потоком, стартонули и забыли.
 

Shouldercannon

Well-Known Member
25.05.2010
128
0
29
Пенза
#3
Давайте попробуем сделать правильную реализацию на примере в кода выше.
 
Последнее редактирование: