高分求助一个简单的线程的问题 急! 在线等 ( 积分: 300 )

P

peryt

Unregistered / Unconfirmed
GUEST, unregistred user!
我在主线程里创建了一个线程 sendMsg:=TsendMsg.create(false);
然后线程去执行了,(线程中已设置了 freeonterminated:=true;)
然后当又需要创建这个线程的时候,我先判断
if sendMsg=nil then
sendMsg:=TsendMsg.create(false);
但是即使线程执行完了,sendMsg 仍然不是nil
我用一个办法就是 在线程的最后一条语句是 sendMsg:=nil
又担心这样会影响线程释放资源, 请问我该如何实现 使线程执行完后
sendMsg 就成为nil了
 
我在主线程里创建了一个线程 sendMsg:=TsendMsg.create(false);
然后线程去执行了,(线程中已设置了 freeonterminated:=true;)
然后当又需要创建这个线程的时候,我先判断
if sendMsg=nil then
sendMsg:=TsendMsg.create(false);
但是即使线程执行完了,sendMsg 仍然不是nil
我用一个办法就是 在线程的最后一条语句是 sendMsg:=nil
又担心这样会影响线程释放资源, 请问我该如何实现 使线程执行完后
sendMsg 就成为nil了
 
覆盖析构函数 加上你那句sendMsg:=nil
 
可以具体点吗?如何覆盖?
 
是在inherited 语句的前面 还是后面?
 
方法一:
同上,Destroy override
方法二:
每次重新创建线程,例:
type
PTSendMsg: ^TSendMsg;
var
PSendMsg: PTSendMsg;
begin
New(PSendMsg);
PSendMsg^ := TSendMsg.Create(True);
try
PSendMsg^.Resume;
fianlly
PSendMsg^.free;
end;
end;
或者
New(PSendMsg);
PSendMsg^ := TSendMsg.Create(True);
PSendMsg^.freeonterminated:=true;
PSendMsg^.Resume;
 
应该是在inherited 后面
 
直接用 sendMsg:=nil
还是类似 java 里 的this:=nil
但是delphi 里好像没有this 指针
 
self := nil;
 
一般的处理方法应该是使用线程类的OnTerminated事件
就是主线程中定义一个函数
然后在sendMsg:=TsendMsg.create(false);之后将事件处理指针连接上
sendMsg.OnTerminated=YourFunction
这样当线程结束运行时就会执行YourFunction函数
在YourFunction函数中sendMsg:=nil就可以了
这样处理占用系统资源非常少,而且也不容易出错
 
self:=nil 是不行的,我试过了
直接用 sendMsg:=nil 就可以
public
destructor Destroy;
override;
destructor TsendMsg.Destroy;
begin
inherited;
sendMsg:=nil;
end;

这样对不对啊?
 
对 在你的这个使用中 前后看出什么差别 但最好放在前面
 
to mike
YourFunction 中只用sendMsg:=nil 就可以了
这样会不会影响 线程资源的释放啊?
比如 析构函数中 要用到sendMsg中 时 已经=nil了
 
不会的
sendMsg:=nil
只是把指针释放了
线程函数的所有部分都会执行到的
 
to peryt:
self := nil;
确实不能使sendMsg = nil,其实sendMsg只是指针,线程资源释放与否与sendMsg = nil 无关,只要你确认sendMsg已释放就可以重新创建线程 sendMsg := TSendMsg.create(false);
如果你不能确认sendMsg已释放,可以用标志来显示,或者干脆用另外一个指针
New(PTSendMsg)。
 
inherited;
sendMsg:=nil;
这样好一点,因为前前面释放了指针可能导致无法释放资源
 
覆盖析构函数
inherited;
sendMsg:=nil;
 
多人接受答案了。
 
顶部