Multithreading 德尔福2006-什么';这是优雅地杀死一个线程并仍然让OnTerminate处理程序开火的最好方法吗?

Multithreading 德尔福2006-什么';这是优雅地杀死一个线程并仍然让OnTerminate处理程序开火的最好方法吗?,multithreading,delphi,thread-safety,terminate,delphi-2006,Multithreading,Delphi,Thread Safety,Terminate,Delphi 2006,我有一个线程,它有时会由于一个永远不会返回的DLL调用而冻结(我怀疑)。在一般情况下,当您调用像Indy这样的阻塞例程时,是否有一种方法可以从中恢复,使线程OnTerminate处理程序触发?如果我打电话给TerminateThread会发生这种情况吗 TerminateThread()是一种直接暴力终止。它不会让onterminate事件触发。OnTerminate可以触发的唯一方法是线程的Execute()方法通过正常方式退出,无论是正常退出还是引发未捕获异常(这将设置线程的FatalExp

我有一个线程,它有时会由于一个永远不会返回的DLL调用而冻结(我怀疑)。在一般情况下,当您调用像Indy这样的阻塞例程时,是否有一种方法可以从中恢复,使线程OnTerminate处理程序触发?如果我打电话给TerminateThread会发生这种情况吗

TerminateThread()
是一种直接暴力终止。它不会让
onterminate
事件触发。
OnTerminate
可以触发的唯一方法是线程的
Execute()
方法通过正常方式退出,无论是正常退出还是引发未捕获异常(这将设置线程的
FatalExpection
属性)


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

听起来更像是老式的死锁,很容易被线程代码归咎于“另一个线程的上下文”?或者你的意思是“来自另一个线程的上下文”?如果你的意思是“为”的话,那么你会怎么做呢?