我可以从VCL线程调用TerminateThread吗?

时间:2019-02-05 13:04:26

标签: multithreading delphi delphi-multithreading

我发现this nice component名为TBackgroundWorker。但是,人们(在SO上)批评它,因为它使用TerminateThread。这是“错误的”代码:

destructor TBackgroundWorker.Destroy;
begin
  if IsWorking then
  begin
    TerminateThread(fThread.Handle, 0);
    Cleanup(True);
    raise EBackgroundWorker.CreateFmt(SInvalidExit, [Name]);
  end;
  inherited Destroy;
end;

对我来说,这似乎是一个有效的析构函数。是吗?我要担心吗?
有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

我认为析构函数是有效的。

强行终止线程是错误的。同样,在析构函数中引发异常可能会杀死整个应用程序。但是,请不要忽略上下文。

我们谈论一个包装线程的代理对象。如果此类组件正在运行,则其破坏与杀死正在运行的线程相当。代理应该快速失败,并报告这种不当行为,而不要对其进行处理。此外,这是一个第三方组件,它不了解应用程序开发人员的意图。

我想你不同意我。否则,我们没有对话。让我们看看替代方案是什么。

  1. 正常执行任务并终止线程,没有异常消息。使用这种方法,我们正在猜测开发人员的意图。如果开发人员犯了一个错误,他或她可能永远不会知道,直到为时已晚。该应用程序将出现意外行为,并且找出问题的根源非常复杂。

  2. 无论如何都会忽略正在运行的线程并销毁组件,而不会引发异常。似乎就像将确定性计算机转变为非确定性计算机一样。我们甚至需要讨论这个问题吗?

  3. 仅引发异常。由于线程仍在运行,因此变量和堆栈跟踪可能包含误导性状态,这使调试更加困难。

我相信我们所有人都希望在开发的早期阶段发现错误,并为我们的客户提供可靠而稳定的应用程序。我们应该停止这样做,因为我们需要使用的工具没有有效的用例吗?

总有一个有效的用例。如果我错了,请启迪。