• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

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

  • Автор темы Автор темы 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 выставляют когда особо не заботятся о то что потом будет с потоком, стартонули и забыли.
 
Давайте попробуем сделать правильную реализацию на примере в кода выше.
 
Последнее редактирование модератором:
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab