#multithreading #delphi #thread-safety #terminate #delphi-2006
#многопоточность #delphi #безопасность потоков #завершить #delphi-2006
Вопрос:
У меня есть поток, который иногда зависает (я подозреваю) из-за вызова DLL, который никогда не возвращается. В общем случае, когда у вас есть вызовы блокирующих подпрограмм, таких как Indy, есть ли способ восстановиться после этого таким образом, чтобы сработал обработчик onTerminate потока? Произойдет ли это, если я вызову TerminateThread ?
Комментарии:
1. Звучит больше как старый добрый тупик, в котором легко может быть виноват ваш потоковый код
Ответ №1:
TerminateThread()
это немедленное завершение грубой силы. Это НЕ позволит OnTerminaate
событию сработать. Единственный способ OnTerminate
может сработать, если метод потока Execute()
завершается обычными средствами, будь то корректно или путем создания неперехваченного исключения (которое установит свойство потока FatalExpection
).
В частности, в случае Indy блокирующую операцию сокета можно прервать, отключив сокет от контекста другого потока. Обычно это невозможно при блокировке функций DLL, если они не предоставляют такую функциональность в своем API.
Комментарии:
1. Это действительно » для контекста другого потока»? Или вы имели в виду » из контекста другого потока»? Если бы вы имели в виду «для», задействован ли TIdContext и как бы вы это сделали?