关于FreeAndNil无法释放

baody8 2018-12-07 01:21:44
1:声明线程对象


2:定义TThread传值有错不,反正freeandnil无法释放线程对象


...全文
1379 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
别激动 2019-01-25
  • 打赏
  • 举报
回复
直接干掉 会有泄漏问题
别激动 2019-01-25
  • 打赏
  • 举报
回复
TerminateThread(x.Handle, 110);
lyhoo163 2019-01-25
  • 打赏
  • 举报
回复
Delphi 的线程,已经封装好实用的方法。应使用delphi提供的方法。

不同语言,终止线程的方式
1、Windows API:
VOID ExitThread( DWORD dwExitCode );

2、C Runtime Library:
void _endthread(void);

3、Delphi Runtime Library:
procedure EndThread(ExitCode: Integer);

线程仍然必须继续执行到正常结束后才行,而不是立即终止线程,这一点要注意。



墨梅无痕 2019-01-10
  • 打赏
  • 举报
回复
基本的,对象实例的创建和销毁应当在同一个作用域,象楼主这样 实例(x: TThread) 在函数外创建,函数内却含有销毁指令(FreeAndNil(x)),将影响代码的一致性和可读性,对调试也不利。
其次,楼主可能需要复习一下方法、函数的参数类型(值参,常量参数,变参,回调参数(所谓的委托delegate)。
minizhuxianchun 2019-01-09
  • 打赏
  • 举报
回复
你这WaitFor对象的属性Finished在哪赋值的?
  • 打赏
  • 举报
回复
呃,确实是我理解错了你的意思...
  • 打赏
  • 举报
回复
引用 5 楼 早打大打打核战争 的回复:
Delphi的对象(class类型)是引用类型,所以 function StopThreadings(x: TThread): boolean; function StopThreadings(const x: TThread): boolean; function StopThreadings(var x: TThread): boolean; 传入的参数是一样的,都是到实参对象实例的引用,没有复制的临时对象,值类型对象要使用object类型。
当然不一样了, 对象变量的复制体.....否则freeandnil怎么能吧传入的参数值改成nil的.......哎
  • 打赏
  • 举报
回复
Delphi的对象(class类型)是引用类型,所以
function StopThreadings(x: TThread): boolean;
function StopThreadings(const x: TThread): boolean;
function StopThreadings(var x: TThread): boolean;
传入的参数是一样的,都是到实参对象实例的引用,没有复制的临时对象,值类型对象要使用object类型。
  • 打赏
  • 举报
回复
1.你要先看自己线程的停止方式是什么, 是否设置了FreeOnTerminate := False, 如果设置了,那么才可以使用你的那个stop函数 2.你的stop函数里的while循环是没有必要的, waitfor就已经是等待结束了 3.freeandnil本身没有问题, 问题是在于你的stop函数参数设置的不对, 应该是 (var x: TThread), 你现在这样相当于x是你实际线程变量的一个复制体, 你把x free了, 线程本身确实被free了没错, 但是x为nil却不会导致变量为nil, 所以你要加var变成引用传递就正确了
lyhoo163 2018-12-07
  • 打赏
  • 举报
回复
是的, 此处FreeAndNil对线程是无效的。
  • 打赏
  • 举报
回复
因为TThread.Terminate;并非强制终止线程,而只是设置Terminated属性为true,是否真的终止取决于线程代码的配合,所以如果你的线程没有真的终止,x.WaitFor;就一直阻塞在那里,后面的代码都没有执行。可以用TerminateThread来强制结束线程,但可能造成资源泄露。
doloopcn 2018-12-07
  • 打赏
  • 举报
回复
简单易用又安全的线程使用方法就是:
创建线程的时候把 Thread.FreeOnTerminate:=True;
然后,结束用 Thread.Terminate;
这样,DELPHI就会把线程的资源释放并把使用权交还给操作系统
================================
你上面那些代码应该是写系统进程、线程调度管理的人员去研究的,如果不是”非常需要“就不必要去钻了

5,388

社区成员

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

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