关于线程的生存期(30分)

  • 主题发起人 主题发起人 zw84611
  • 开始时间 开始时间
Z

zw84611

Unregistered / Unconfirmed
GUEST, unregistred user!
如果我在一个父线程中创建了多个子线程,假定子线程运行需要较长时间,
当我强制终止父线程时,子线程也会终止吗?
如果我关闭了程序,线程还会继续运行吗?
 
如果使用Delphi的TThread作为父类派生的线程,父线程创建子线程后,父线程结束,
子线程不会自动销毁。
当然,当关闭程序后,属于该进程的线程回全部被销毁,但是在线程中分配的内存资
源有可能不会释放。
 
那么如何知道线程中分配的内存资源是否被释放呢?。
 
理论上说,一个进程撤消时,它所有的线程(资源)也应该被撤消了;因为线程的
堆栈(内存资源)是在进程的地址空间内的,进程空间被撤消,当然它的线程的堆
栈也被撤消。但有可能进程被非法终止,这时线程被强制撤消,导致一些对象的析
构函数没有被调用,这可能会有潜在危险。

 
说一下我的问题:
我建了一个线程,当该线程结束运行时,所分配的内存都能被释放(通过 destroy 方法)。
但是考虑到有可能需要中途结束线程,所有又加了一个方法
suspend;
if Msg("do you want to cancel").... then

terminate
else
resume;
按照delphi帮助的说法, terminate方法并不立即杀掉线程,而是需要在execute或其他循环中
判断 terminated 属性来结束。但是我的程序每次执行到上述语句的时候,线程就自动杀掉了。
在execute或其他循环中的语句 :
if terminated then
free ;
根本没有被执行。结果线程分配的内存无法释放。即使我在terminate 语句之前加上一个子过程
dofree()来释放所分配的内存,用mrymanager监测的结果还是没有释放资源。

请问如何能够释放线程分配的内存?
 
可用Onterminate事件,另外,要设置属性FreeOnTerminate:=false;
 
线程的Constrator 函数的时候加上 FreeOnTerminate:= true;
线程结束的时候就会自动释放占用资源的。
否则,你只能手工释放。
 
同意pyh
只能自己在释放线程里分配的内存
线程对象如果不是线程自己结束的而是被主进程杀掉的,多数情况都会造成内存泄漏
拿memproof试一下就知道了
可是麻烦的是一个多线程的程序往往需要杀掉某个线程,没有好法子啊
这就是为什么装windows的机器经常需要重起的原因
mysql的文档说他们的程序在NT下每开一个线程再杀掉就会丢失200多个字节
残念..........................
我曾听说过做有的公司基于WEB数据应用的NT server 由于访问量大需要每天重起一次
 
提问者:
如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
请认真阅读大富翁论坛规则说明 http://www.delphibbs.com/delphibbs/rules.asp
 
1 当我强制终止父线程时,子线程不会终止
2 如果我关闭了程序,线程不会继续运行
 
如果你的线程execute中用clientdataset的话,
您想在线程执行完后自动终止都难,
我现在就碰到这个问题,
真是难办请看http://www.delphibbs.com/delphibbs/dispq.asp?lid=571655
 
强制终止父线程时,子线程不会终止
如果你关闭了程序,线程不会继续运行。
线程中加上FreeOnTerminate:= true 可以自动释放线程资源。
就算是程序有错误,都会释放。
否则自己释放(free)。
 
抱歉,好久没能上来。正是有劳大家了。
 
后退
顶部