关于多线程停止释放问题

baody8 2018-11-03 02:03:22
子线程,空转不加任何东西
procedure Twork.Execute;
begin
FreeOnTerminate:=true;
while not Terminated do
begin
Sleep(1);
end;
end;


主线程停止,问题来了,这种方式线程无法释放.

FTwork:=Twork.Create(False);
FTwork.Terminate;
...全文
114 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
doloopcn 2018-11-15
  • 打赏
  • 举报
回复
procedure Twork.Execute;
begin
FreeOnTerminate:=true;
while not Terminated do
begin
Sleep(1);
end;
end;
这个代码就不应该这样写吧:
procedure Twork.Execute;
begin
//这一行不应该出现这里FreeOnTerminate:=true;
while true do
begin
Sleep(1);
end;
end;
调用:
var Work:TWork;
....
begin
Work:TWork.Create(False);
Work.FreeOnTerminate:=True;
Work.Resume;
end;
释放:
Work.Terminate;//DELPHI会自动释放线程资源,自动FREE
llllyyyy_61 2018-11-14
  • 打赏
  • 举报
回复
FreeOnTerminate:=true;这句应该放while的后面?
主线程:FTwork:=Twork.Create(False);
FTwork.FreeOnTerminate:=true;//上面做了这里应该不用做的

//顺利执行完上面的,下面应该不用执行
//关闭
FTwork.Terminate();
FTwork.Free;
ooolinux 2018-11-03
  • 打赏
  • 举报
回复
引用 9 楼 baody8 的回复:
[quote=引用 8 楼 u010165006 的回复:]
[quote=引用 5 楼 baody8 的回复:]
[quote=引用 3 楼 u010165006 的回复:]
FreeOnTerminate:=true;
要放在子线程的构造函数里。


不放可以吗?

[/quote]

看看书吧,好一点的书比较有说服力。[/quote]

那不用构造怎么释放呢[/quote]

不自动释放的话,一般要
WaitFor
Free
flcop 2018-11-03
  • 打赏
  • 举报
回复
你这样立即调用Terminate,有可能Execute还没来得及执行就退出了, 建议把设置FreeOnTerminate放到构造函数中。
baody8 2018-11-03
  • 打赏
  • 举报
回复
引用 8 楼 u010165006 的回复:
[quote=引用 5 楼 baody8 的回复:]
[quote=引用 3 楼 u010165006 的回复:]
FreeOnTerminate:=true;
要放在子线程的构造函数里。


不放可以吗?

[/quote]

看看书吧,好一点的书比较有说服力。[/quote]

那不用构造怎么释放呢
ooolinux 2018-11-03
  • 打赏
  • 举报
回复
引用 5 楼 baody8 的回复:
[quote=引用 3 楼 u010165006 的回复:]
FreeOnTerminate:=true;
要放在子线程的构造函数里。


不放可以吗?

[/quote]

看看书吧,好一点的书比较有说服力。
BlueStorm 2018-11-03
  • 打赏
  • 举报
回复
因为前面有FreeOnTerminate:=true; 所以FTwork.Terminate;执行完后,线程就会自动释放,不需要也不能再执行FTwork.Free,;
baody8 2018-11-03
  • 打赏
  • 举报
回复
引用 6 楼 sanjianxia 的回复:
不放要手动进行释放。

我这是WHILE阿,怎么自动释放
sanjianxia 2018-11-03
  • 打赏
  • 举报
回复
不放要手动进行释放。
baody8 2018-11-03
  • 打赏
  • 举报
回复
引用 3 楼 u010165006 的回复:
FreeOnTerminate:=true;
要放在子线程的构造函数里。


不放可以吗?

baody8 2018-11-03
  • 打赏
  • 举报
回复
引用 2 楼 flcop 的回复:
你这样立即调用Terminate,有可能Execute还没来得及执行就退出了, 建议把设置FreeOnTerminate放到构造函数中。

问题是没有释放谢谢
ooolinux 2018-11-03
  • 打赏
  • 举报
回复
FreeOnTerminate:=true;
要放在子线程的构造函数里。

5,387

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧