如何从另一个事件/线程停止执行一个事件/线程?

问题描述 投票:0回答:1

我有一个更高层次的问题。

我有一些代码(伪代码):

{
   functioncall1();
   functioncall2();
   functioncall3();
   functioncall4();
   functioncall5();
}

当事件/线程触发时就会发生这种情况。在一个单独的事件中,我需要停止执行所有进一步的事情:

{
   stopAllExecution();
}

我不知道该怎么做,除了将原始事件更改为:

{
   if (executionHasStopped) {
      functioncall1();
   }
   if (executionHasStopped) {
      functioncall2();
   }   
   if (executionHasStopped) {
      functioncall3();
   }
   if (executionHasStopped) {
      functioncall4();
   }
   if (executionHasStopped) {
      functioncall5();
   }
}

我不想在代码中到处乱扔这些检查,但我想不出另一种方法来停止执行。

我正在德尔福运行,如果这很重要的话。

有人知道更好的方法来实现这一目标吗?

multithreading delphi delphi-2010
1个回答
0
投票

通常,安全的方法是在线程中构造代码,以便定期检查某些信号的状态,并在设置退出条件时干净地退出。

对于使用循环处理数据集的线程来说,这相对简单;在循环的每次迭代之前/之后引入对退出条件的检查,如果设置则中止循环。

对于仅执行一系列步骤的线程,您别无选择,只能在这些步骤中的适当点引入对退出条件的检查,并且仅在未设置时才继续;也就是说,不幸的是,它确实意味着用支票“乱扔你的代码”。

但是,根据线程执行的操作,存在一个“核选项”,其形式为 TerminateThread Api

此 Api 的使用适用条件(请阅读文档),并且在管理线程可能获取和/或拥有的任何资源(如果使用此方法终止线程)方面有重要的注意事项,因为它们将不提供任何资源。清理或释放任何此类资源的机会。

但是,只要您的情况下的线程可以安全地预先终止,这将提供您正在寻找的控制反转,允许监督线程终止工作线程,而这些工作线程不必实现任何终止/退出事件检查。

这并不构成使用此方法的建议,只是为了告知您该方法的存在。如果不深入了解您的代码的具体情况,就不可能判断它是否适合您的情况;只有你可以决定。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.