Delphi 2006 - Какой лучший способ изящно убить поток и при этом запустить обработчик OnTerminate? - PullRequest
3 голосов
/ 23 октября 2011

У меня есть поток, который иногда зависает (я подозреваю) из-за вызова DLL, который никогда не возвращается. В общем случае, когда у вас есть вызовы для блокирования подпрограмм, таких как Indy, есть ли способ исправить это так, чтобы сработал обработчик потока OnTerminate? Произойдет ли это, если я позвоню TerminateThread?

1 Ответ

9 голосов
/ 23 октября 2011

TerminateThread() - немедленное прекращение перебора.Это НЕ позволит событию OnTerminaate сработать.Единственный способ запустить OnTerminate - это если метод потока Execute() завершается обычным способом, будь то изящно или путем вызова необработанного исключения (которое установит свойство потока FatalExpection).

ВВ частности, в случае Indy блокирующую операцию сокета можно прервать, отсоединив сокет от контекста другого потока.Обычно это невозможно при блокировке функций DLL, если они не предоставляют такую ​​функциональность в своем API.

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