有关TThread的FreeOnTerminte

kxy 1999-12-29 12:11:00
如果一个Thread在运行中,主程序结束,FreeOnTerminate没有
起作用,也就是说,Thread没有被释放,内存出现泄漏,如果Thread执行
完,主程序结束,Thread被释放.

OnFormClose中,Thread.Terminate,强制Thread结束也没有作用,
不知大家有没有好建议.

我是用,MemProof程序检查到内存泄漏的.
...全文
1704 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
光明山人 2000-01-20
  • 打赏
  • 举报
回复
瞎给分。
kxy 2000-01-20
  • 打赏
  • 举报
回复
to : agui
问题是没有解决.
我在提问.:)
kxy 1999-12-30
  • 打赏
  • 举报
回复
我是直接编译lmd的source, lmd是有许多错误
,我就改了一大堆,谢谢 tiger
tiger 1999-12-30
  • 打赏
  • 举报
回复
呵呵, 对不起, 一般我不用第三方的控件. 而且LMD的源码是不是和dcu一样还有待考证
barton 1999-12-30
  • 打赏
  • 举报
回复
LMD和RX的控件我都不敢用,太不保险.DFS的保险.
kxy 1999-12-29
  • 打赏
  • 举报
回复
FreeOnTerminate 是一个变量.
FreeOnTerminate := True;
我并不显示的调用Free;而是由TThread类隐式调用,
但如果此线程正在执行,Free没有被调用.不知为何?
jiangtao 1999-12-29
  • 打赏
  • 举报
回复
不会吧,Thread被Destroy时,FreeOnTerminate就应该被调用,
是否Memproof误报
tiger 1999-12-29
  • 打赏
  • 举报
回复
FreeOnTerminate的含义并不是主程序Terminate时Free, 而是在Thread Terminate时, 所创建的Thread Object自动Free.
Thread.Terminate也并不是强制Thread结束, 只是把Thread.Terminated置为True而已.
如果你的线程是个while true do类型的, 设了FreeOnTerminate := True应该没有什么用
你可以在主程序结束时, 给线程发个信号, 等待线程的terminate后主程序再退出.
kxy 1999-12-29
  • 打赏
  • 举报
回复
tiger有些道理,你有LMD的控件吗?
TLMDHiTimer会导致内存泄漏.(使用 Thread),
不只tiger有何建议 :)
tiger 1999-12-29
  • 打赏
  • 举报
回复
TThread.Destroy并不等于主程序退出, 会等待Thread结束. 只是说明Thread在Destroy时会做一些什么事而已.
建议你还是等等看吧
kxy 1999-12-29
  • 打赏
  • 举报
回复
>>如果你的线程是个while true do类型的, 设了FreeOnTerminate := True应该没有什>>么用
while true do 线程结束时,主程序不结束,FreeOnTerminate是有用的.
请看VCL中TThread的代码
destructor TThread.Destroy;
begin
if not FFinished and not Suspended then
begin
Terminate; //设置变量
WaitFor; // 等待宪成结束.
end;
if FHandle <> 0 then CloseHandle(FHandle);
inherited Destroy;
RemoveThread;
end;

也就是主程序退出, 会等待Thread结束.但好像不是这样.
我用Memproof测试过Delphi自带的TThread的例子,在排序过程中关闭Form
有内存泄漏,等排序结束在关闭则没有泄漏.

5,387

社区成员

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

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