Delphi - завершить заблокированную тему

Возможный дубликат:
Как прекратить долго выполнять темы изящно?

Привет.

У меня есть фоновый поток, который должен выполнить операцию, он работает нормально все время, кроме одного случая: когда ресурс поврежден. Когда это происходит, поток блокируется в вызовах Load (к этому ресурсу) в методе Execute.

Когда это происходит, поток не отвечает на метод Terminate (вызов из основного потока) и блокируется.

Итак, мой вопрос: как правильно завершить заблокированный поток (из основного потока). И нет, я не могу изменить класс, который загружает ресурс, или не знаю ранее, если ресурс поврежден или нет.

1 ответ

Ищу TerminateThread() Функция WinAPI. Некоторое полезное объяснение можно найти здесь или посмотреть документацию MSDN.

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


Обновить

Да, используя TerminateThread Это плохая практика (как указано в комментариях). Я согласен с этим мнением. Но "никогда не используйте его, даже если вам действительно нужно его использовать", рекомендация слишком сильная, с моей точки зрения, и очень теоретическая. Реальный мир полон недостатков дизайна и глючных сторонних библиотек.
Информации, приведенной в вопросе, недостаточно для принятия правильного решения об этой конкретной ситуации. Например, это может быть временный обходной путь без альтернатив и т. Д.
Следовательно, с теоретической точки зрения правильный ответ таков: "Нет способа правильно завершить процесс, если вы не можете контролировать, как" заморозить "шаг в фоновом потоке обработки".
С практической точки зрения правильный ответ таков: "Невозможно правильно завершить процесс, если вы не можете контролировать, как" заморозить "шаг в фоновом потоке обработки. Но если вы понимаете, что не можете, но все еще нуждаетесь в такой функциональности" - использовать вызов API TerminateThread ()

О TerminateThread против TerminateProcess:
- Создание / завершение процесса требует больше ресурсов, чем создание / завершение потока
- Создание / завершение процесса более сложным => больше места для ошибок
- TerminateProcess не завершается немедленно и ожидает завершения операций ввода-вывода ( MSDN) => не выбирается для сценария, когда удаленная общая папка становится недоступной во время чтения, и других аналогичных сценариев ввода-вывода.
- Создание и завершение процесса требует больше прав пользователя, чем создание потока, сравните MSDN здесь и здесь

Об освобождении ресурса:
Стек потока освобождается автоматически при завершении потока (как указано в MSDN). Ресурсы - это прежде всего ресурсы, выделенные основным потоком для связи с фоновым потоком. Например, структуры памяти, мьютексы и т. Д.

Другие вопросы по тегам