max*_*fax 6 delphi multithreading terminate
如何在应用程序关闭时正确停止线程?
我这样做:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if not Thread1.Finished
then
begin
Thread1.Terminate;
Thread1.WaitFor();
end;
end;
Run Code Online (Sandbox Code Playgroud)
但是在Thread1.WaitFor上我有一个错误:"线程错误:句柄无效(6)." 如果我做WaitForSingleObject(Thread1.Handle,无限)而不是WaitFor就可以了.
为什么我使用Thread.freeonterminate:= false然后WaitFor工作正常?请解释我的错误.据我所知,我需要使用"if Assigned"而不是"if not Thread1.Finished",对吧?
Rob*_*edy 11
设置时FreeOnTerminate = True,线程对象在终止时自动释放.因此,在它终止后,对该对象的任何进一步调用都是无效的.一旦调用Terminate,就必须假设该对象不再存在.
如果在启动后需要对线程进行进一步操作,则不要设置FreeOnTerminate.相反,在您真正使用它之后手动释放它.
你唯一可以使用的Assigned是你期望Thread1变量nil.你有分配Thread1 := nil吗?如果没有,那么你不应该期望它具有那个价值.您应该知道,当您调用方法时,变量不会突然改变它们的值.但是如果你已经设置了FreeOnTerminate,那么检查Finished属性也是不正确的,因为它可能已经完成并释放了自己.