gpt4 book ai didi

multithreading - 在没有 MyThread.Terminate 的情况下终止线程

转载 作者:行者123 更新时间:2023-12-03 15:50:59 25 4
gpt4 key购买 nike

在表单中,我有一个按钮“中止”。在它上面我添加了 mythread.terminate 用于终止线程。现在,在执行方法中,我使用变量 termerated 并管理它。但是当我没有循环,而是一条需要很多时间的指令时,因为我可以杀死线程?

例如代码为:

procedure MyThread.Execute;
begin
Sleep (10000);
end;

我想在线程完成工作之前杀死它,就像我所做的那样?使用:

MyThread.Terminate

应用程序卡住。

更新:

在不终止的情况下使用,可以使该解决方案有效,从某种意义上说它有效:

flag := false;
while not terminated do
begin
if not flag then
begin
xxx := myfunction ();
flag := true;
terminate;
end;
end

已解决:

我尝试过这样做,但我的印象是效果很好:

procedure MyThread.Execute;
begin
FreeOnTerminate := True;
while not Terminated do
begin
Sleep (10000); // Just an example for take long time.
Terminate; // This will set Terminated to True, so it won't iterate next time.
end;
end;

我应该做什么?

最佳答案

如果您有一个需要很长时间的单个方法调用,那么最好的解决方案是在该单个方法调用中进行更改以定期检查是否终止。

强行终止线程会导致资源泄漏、死锁和大量屠杀无辜婴儿。实际上,我不能 100% 确定最后一点的准确性,但我想您可以理解我想说的——不要强行终止线程。

<小时/>

如果您无权访问这个长时间运行的方法的内部,那么您确实陷入了困境。我过去曾经遇到过这种情况,并设法通过破坏传递给该方法的输入数据来解决该问题。例如,就我而言,我传递了大型浮点值数组。事实证明,将所有这些浮点值设置为 NaN 信号足以使长时间运行的方法停止并返回。也许您将能够使用类似的方法。

关于multithreading - 在没有 MyThread.Terminate 的情况下终止线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6923919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com