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

  • Автор темы Автор темы Shouldercannon
  • Дата начала Дата начала
S

Shouldercannon

Реализация
Код:
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" не работает), но делать так не советуют. Как правильно реализовать задуманное?
 
Потому что переменная MyThread нигде не принимает значения nil, следовательно можно нарваться на исключение.
Другими словами проверка if MyThread <> nil then не имеет смысла.

А правильность зависит от того что вы делаете, и для чего вам эта проверка.
Как правило FreeOnTerminate выставляют когда особо не заботятся о то что потом будет с потоком, стартонули и забыли.
 
Давайте попробуем сделать правильную реализацию на примере в кода выше.
 
Последнее редактирование модератором:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!