Могу ли я вызвать TerminateThread из потока VCL? - PullRequest
0 голосов
/ 05 февраля 2019

Я нашел этот замечательный компонент под названием TBackgroundWorker.Тем не менее, люди критикуют его (на SO), потому что он использует TerminateThread.Вот «неисправный» код:

destructor TBackgroundWorker.Destroy;
begin
  if IsWorking then
  begin
    TerminateThread(fThread.Handle, 0);
    Cleanup(True);
    raise EBackgroundWorker.CreateFmt(SInvalidExit, [Name]);
  end;
  inherited Destroy;
end;

Для меня это кажется действительным деструктором.Это?Стоит ли волноваться?
Есть лучшее решение?

1 Ответ

0 голосов
/ 10 февраля 2019

На мой взгляд, деструктор действителен.

Принудительное завершение потока неверно.Кроме того, создание исключения в деструкторе может уничтожить все приложение.Однако, пожалуйста, не игнорируйте контекст.

Мы говорим о прокси-объекте, который оборачивает поток.Если такой компонент работает, его уничтожение сравнимо с уничтожением работающего потока.Прокси должен быстро потерпеть неудачу и сообщать о таком нарушении, а не манипулировать им.Кроме того, это сторонний компонент, который не знает намерений разработчика приложения.

Полагаю, вы не согласны со мной;в противном случае у нас не было этого разговора.Давайте посмотрим, какие есть альтернативы.

  1. Отмена задачи и корректное завершение потока, сообщение об исключении отсутствует. При таком подходе мы предполагаем намерение разработчика,Если разработчик допустил ошибку, он или она может никогда не узнать, пока не станет слишком поздно.Приложение будет иметь непредвиденное поведение, и очень сложно выяснить источник проблемы.

  2. Игнорирование запущенного потока и уничтожение компонента в любом случае, без вызова исключения. Похоже на превращение детерминированной машины в недетерминированную.Нужно ли нам даже обсуждать это?

  3. Просто вызывает исключение. Поскольку поток все еще работает, переменные и трассировка стека могут содержать ошибочные состояния, что делаетотладка намного сложнее.

Я считаю, что нам всем нравится обнаруживать ошибки на ранней стадии разработки и предлагать нашим клиентам надежное и стабильное приложение.Должны ли мы прекратить это делать, потому что для инструмента, который нам нужно использовать, нет действительного варианта использования?

Для чего-то всегда есть действительный вариант использования.Если я ошибаюсь, пожалуйста, просветите меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...