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

时间:2011-10-23 00:29:40

标签: multithreading delphi thread-safety terminate delphi-2006

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

1 个答案:

答案 0 :(得分:9)

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

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