Delphi 2006 - 优雅地杀死一个线程并且仍然使用OnTerminate处理程序的最佳方法是什么?

ros*_*mcm 3 delphi multithreading terminate thread-safety delphi-2006

我有一个线程有时冻结(我怀疑)由于DLL调用永远不会返回.在一般情况下,如果您调用了像Indy这样的阻塞例程,有没有一种方法可以通过线程OnTerminate处理程序触发来恢复?如果我调用TerminateThread会发生这种情况吗?

Rem*_*eau 9

TerminateThread()是立即蛮力终止.它不会让OnTerminaate事件发生.唯一OnTerminate可以触发的Execute()方法是,如果线程的方法通过正常方式退出,无论是优雅还是通过引发未捕获的异常(这将设置线程的FatalExpection属性).

特别是在Indy的情况下,可以通过断开套接字与另一个线程的上下文来中止阻塞套接字操作.阻止DLL函数通常不会这样,除非它们在API中公开这种功能.