Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 中止线程?_Multithreading_Delphi_Delphi 2010 - Fatal编程技术网

Multithreading 中止线程?

Multithreading 中止线程?,multithreading,delphi,delphi-2010,Multithreading,Delphi,Delphi 2010,我想实现基于后台线程的可中断任务。实现TTask.Stop方法最干净的方法是什么?如何中止后台线程 在线程上下文中执行的代码使用匿名方法传递给任务,并且可以包含阻塞调用,因此我不能依赖这样一个事实,即从代码中定期检查Terminated标志 谢谢你的意见 在重要的情况下使用D2010(在TThread中的某些内容似乎已更改)无法安全地中止正在运行的线程。无论是否用Delphi编写,无论是否使用Delphi 2010或更早版本,Windows程序都是如此。如果你想这么说的话,这是操作系统的限制,但

我想实现基于后台线程的可中断任务。实现
TTask.Stop
方法最干净的方法是什么?如何中止后台线程

在线程上下文中执行的代码使用匿名方法传递给任务,并且可以包含阻塞调用,因此我不能依赖这样一个事实,即从代码中定期检查
Terminated
标志

谢谢你的意见


在重要的情况下使用D2010(在
TThread
中的某些内容似乎已更改)

无法安全地中止正在运行的线程。无论是否用Delphi编写,无论是否使用Delphi 2010或更早版本,Windows程序都是如此。如果你想这么说的话,这是操作系统的限制,但实际上这是线程的限制,因为在不确定线程是否持有锁的情况下中止线程或类似的操作会对你的程序造成严重破坏


你能做的就是调用API函数,这是邪恶的。阅读此链接中的问题和警告列表,查看是否仍要调用它。没有任务代码的配合,没有其他方法可以工作。

将作业隔离到单独的流程中。根据您与后台作业的通信方式,这可能是保证您可以干净地中止它的最佳方式


例如,使用共享内存进行通信可能不是一个好的ide;使用文件、管道或类似的机制,在另一端被杀死时不会中断或停止。如果使用命名互斥体进行跨进程同步,请注意这些同步原语有一个特定的错误状态:WaitForSingleObject和friends将返回WAIT_Discarded,前提是上次保存原语的线程(或隐式地,进程的主线程)在未完全释放原语的情况下终止。基本上,这意味着您需要使用分阶段事务方法进行数据传输,这样您就可以忽略终止时正在修改的可能不一致的状态。

这是一个很好的(+1)答案;参见Python线程,其中大部分由全局解释器锁构成,全局解释器锁负责线程安全(好)和所有实际用途,将多线程代码限制为单个核心(坏)。这个问题的最佳解决方案是不使用线程,而是通过多处理包使用进程,以及这种跨多台机器扩展的即时能力所带来的好处,这最终成为大规模扩展的必要条件。与其担心线程安全,不如在Delphi中实现简单(更容易)的多进程管理。信号量没有“放弃”状态,因为它们没有任何内置的所有权概念。(就操作系统而言,线程不能“持有”信号量。)只有互斥可以被检测到地放弃。这可能是使用阻塞代码实现可中断任务的一个好方法,但是我不认为问题中的功能(匿名方法的可中断任务)应该如何用Delphi实现。需要有一个运行时编译器,才能从匿名方法创建一个可执行文件(作为不同的进程生成),不是吗?Rob,说得好,我删除了它。mghie-你不能中断一个线程,所以它必须在另一个进程中。这意味着你不能使用匿名方法。如果您需要可靠地中断任意代码,那么代码需要处于不同的进程中,因此这是一种具有体系结构影响的方法。