我想实现基于后台线程的可中断任务。实现该TTask.Stop
方法的最干净的方法是什么?如何中止后台线程?
在线程上下文中执行的代码使用匿名方法传递给任务,并且可以包含阻塞调用,所以我不能依赖这样一个事实,即Terminated
从代码中定期检查标志。
感谢您的任何意见。
使用 D2010 以防万一(有些事情TThread
似乎已经改变)
我想实现基于后台线程的可中断任务。实现该TTask.Stop
方法的最干净的方法是什么?如何中止后台线程?
在线程上下文中执行的代码使用匿名方法传递给任务,并且可以包含阻塞调用,所以我不能依赖这样一个事实,即Terminated
从代码中定期检查标志。
感谢您的任何意见。
使用 D2010 以防万一(有些事情TThread
似乎已经改变)
没有办法安全地中止正在运行的线程。这适用于 Windows 程序,无论是否使用 Delphi 编写,也无论使用 Delphi 2010 或更早版本。如果您想这样称呼它,这是操作系统的限制,但实际上它是线程的限制,因为中止线程而不确保它没有持有锁或类似的东西会对您的程序造成严重破坏。
你可以做的是调用TerminateThread()
API函数,这是邪恶的。阅读此链接中的问题和警告列表,看看您是否仍想调用它。如果没有任务代码的合作,没有其他方法可以工作。
将作业隔离到一个单独的进程中。根据您与后台作业的通信方式,这可能是保证您可以干净地中止它的最佳方式。
例如,使用共享内存进行通信可能不是一个好主意。使用文件或管道,或在另一端被杀死时不会中断或停止的类似机制。如果您使用命名互斥锁进行跨进程同步,请注意这些同步原语存在特定的错误状态:如果最后持有原语的线程(或隐式进程的主线程)是没有干净地释放它就终止了。基本上,这意味着您需要使用分阶段的事务方法进行数据传输,以便您可以忽略在终止时正在修改的可能不一致的状态。