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

Тема в разделе "Delphi - Система", создана пользователем Shouldercannon, 13 сен 2016.

  1. Shouldercannon

    Shouldercannon Well-Known Member

    Регистрация:
    25 май 2010
    Сообщения:
    125
    Симпатии:
    0
    Реализация
    Код (Delphi):
    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" не работает), но делать так не советуют. Как правильно реализовать задуманное?
     
  2. -master-

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    19
    Потому что переменная MyThread нигде не принимает значения nil, следовательно можно нарваться на исключение.
    Другими словами проверка if MyThread <> nil then не имеет смысла.

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

    Shouldercannon Well-Known Member

    Регистрация:
    25 май 2010
    Сообщения:
    125
    Симпатии:
    0
    Давайте попробуем сделать правильную реализацию на примере в кода выше.
     
    #3 Shouldercannon, 13 сен 2016
    Последнее редактирование: 14 сен 2016
Загрузка...

Поделиться этой страницей