gpt4 book ai didi

multithreading - 为什么在等待我告诉终止的线程时会收到 "The handle is invalid"?

转载 作者:行者123 更新时间:2023-12-03 14:58:03 26 4
gpt4 key购买 nike

当应用程序关闭时如何正确停止线程?

我这样做:

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if not Thread1.Finished
then
begin
Thread1.Terminate;
Thread1.WaitFor();
end;
end;

但是在 Thread1.WaitFor 上我有一个错误:“线程错误:句柄无效 (6)。”如果我做 WaitForSingleObject(Thread1.Handle,infinite) 而不是 WaitFor 一切都可以。

为什么如果我使用 Thread.freeonterminate := false 那么 WaitFor 效果很好?请解释一下我做错了什么。据我了解,我需要使用“如果已分配”而不是“如果不是 Thread1.Finished”,对吗?

最佳答案

当您设置FreeOnTerminate = True时,线程对象在终止时会自动释放自身。因此,在它终止后,对该对象的任何进一步调用都是无效的。一旦调用Terminate,您就必须假设该对象不再存在。

如果您需要在启动线程后对其执行进一步操作,则不要设置FreeOnTerminate。相反,在您真正使用完它之后手动释放它。

唯一需要使用Assigned 的情况是当您期望Thread1 变量为nil 时。你曾经分配过Thread1 := nil吗?如果没有,那么您就不应该期望它具有该值(value)。您应该知道,当您调用变量的方法时,变量的值不会突然改变。但是,如果您设置了 FreeOnTerminate,那么检查 Finished 属性也是不正确的,因为它可能已经完成并释放了自身。

关于multithreading - 为什么在等待我告诉终止的线程时会收到 "The handle is invalid"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6313645/

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