线程对象结束后不自动释放指针的解决办法?(100分)

  • 主题发起人 主题发起人 a_mao_gong
  • 开始时间 开始时间
A

a_mao_gong

Unregistered / Unconfirmed
GUEST, unregistred user!
很久没来富翁,也很久没用delphi了。以下是我目前遇到的一个棘手问题,希望有做过多线程的富友帮忙解决一下。
我在主线程中定义了一个线程对象,定义是为了可以手动控制,我每次创建线程前先判断一下这个线程对象的是否为空,如果为空就创建,不为空就但还在运行。现在的问题是我在procedure Execute;
begin
inherited;
FreeOnTerminate := true;
case IsCluster of
0: ...;
1: ...;
2: ...;
end;
// end case
end;
加上了 FreeOnTerminate := true;
线程结束的也释放了占用的资源,但在主线程中写的
if not Assigned(Thread) then
begin
Thread := Thread.Create(true);
....
end
就永远不会执行了,这个时候看Thread对象指针并不为空,也就是说, FreeOnTerminate := true;这句话释放了线程所占用的资源,但线程对象的指针并没有被释放掉,现在我想知道有没有什么好的办法可以让线程自己结束自动释放线程对象指针?谢谢!
 
这问题的原理很简单, 与前面有人提到过的废弃了的变量还能访问的道理是一样的, delphi并没在线程退出后将你的thread变量置nil;
你只能用其他变通的办法了, 例如使用线程ID, 创建线程后获取线程ID, 主程序循环检查这个线程ID的活动情况(GetExitCodeThread)来判断工作线程是否结束;
 
这个办法是可以,不过我想有没有一种thread对象结束后自己释放的办法,因为我要创建的线程不只一个。
 
这个貌似只能这样了,除非手动将你的线程指针置为NIL,否则就是那个所说的悬挂指针,也就是野指针的道理差不多吧。。。
 
都走到家门口了, 进屋子里还远吗?
用个链表(TList)记录你新建的线程, 主程序循环检查这个List中的每个线程就可以了;
//delphi里有专门的比较安全的ThreadList可以使用...
程序员不动脑筋, 真的不如去建筑工地搬砖;
//这句话很难听, 但对这里的许多人来说也许是最重要的技术解答!
 
不是可以动态指定OnTerminate嘛
在这里将指针置空
 
问题解决了,只是线程结束不自动释放就不会发生空指针的情况。现在已经改成手动释放了。
 
多人接受答案了。
 
后退
顶部