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 我可以从VCL线程调用TerminateThread吗?_Multithreading_Delphi_Delphi Multithreading - Fatal编程技术网

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

Multithreading 我可以从VCL线程调用TerminateThread吗?,multithreading,delphi,delphi-multithreading,Multithreading,Delphi,Delphi Multithreading,我找到了一个叫TBackgroundWorker的人。然而,人们批评它,因为它使用TerminateThread。以下是故障代码: destructor TBackgroundWorker.Destroy; begin if IsWorking then begin TerminateThread(fThread.Handle, 0); Cleanup(True); raise EBackgroundWorker.CreateFmt(SInvalidExit, [

我找到了一个叫TBackgroundWorker的人。然而,人们批评它,因为它使用TerminateThread。以下是故障代码:

destructor TBackgroundWorker.Destroy;
begin
  if IsWorking then
  begin
    TerminateThread(fThread.Handle, 0);
    Cleanup(True);
    raise EBackgroundWorker.CreateFmt(SInvalidExit, [Name]);
  end;
  inherited Destroy;
end;
对我来说,它似乎是一个有效的析构函数。它是?我应该担心吗?
有更好的解决办法吗

在我看来,析构函数是有效的

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

我们讨论一个封装线程的代理对象。如果这样一个组件正在运行,它的破坏相当于杀死一个正在运行的线程。代理应该迅速失败并报告这样的错误行为,而不是操纵它。此外,这是一个第三方组件,它不知道应用程序开发人员的意图

我想你不同意我的观点;否则,我们就没有这次谈话。让我们看看其他的选择是什么

取消任务并优雅地终止线程,没有异常消息。通过这种方法,我们可以猜测开发人员的意图。如果开发人员犯了错误,他或她可能永远不会知道,直到为时已晚。应用程序可能会有意外的行为,并且找出问题的根源非常复杂

忽略正在运行的线程并销毁组件,但不会引发异常。似乎把确定性机器变成了非确定性机器。我们需要讨论这个吗

只是提出一个例外。因为线程仍在运行,所以变量和堆栈跟踪可能持有误导性的状态,这使得调试更加困难

我相信我们都喜欢在开发的早期阶段发现bug,并为我们的客户提供可靠和稳定的应用程序。我们是否应该停止这样做,因为我们需要使用的工具没有有效的用例


对于某些东西总是有一个有效的用例。如果我错了,请告诉我。

人们具体在哪里批评它?为什么他们说TerminateThread是个问题?如果关闭不当,它也只会调用TerminateThread查看SInvalidExist的定义。我认为Raymond Chen是一位值得信赖的权威,他告诉人们不要使用TerminateThread…此外,上述代码无论TerminateThread问题如何,都不是有效的Delphi析构函数。Delphi析构函数永远不应该引发异常,除非您计划在此时关闭整个应用程序。看起来像是紧急出口,可能您不希望在工作人员工作时释放组件。@SertacAkyuz:是的。我也看到了。它只在不适当地关闭时调用TerminateThread查看SInvalidExit的定义。“不适当的应该是不适当的。”MartynA,谢谢你提醒我注意我的错误。我据此编辑了我的答案。嗨,坎比兹。我觉得你的组件很棒。我真的很感激你为Delphi社区提供了免费软件。我不反对你终止线程的方式,也不同意。这就是我开始讨论的原因。为了看看其他人是否能调和Raymond Chen的观点,目前还没有有效的使用案例,但我们仍然需要以某种方式结束这个主题: