大富翁的水平也不过如此-----大家停止吹水吧,请看这道题,这是能力的体验。高高手请进!!!!!!!!!!!!! (61分)

C

Campo

Unregistered / Unconfirmed
GUEST, unregistred user!
如何判断对象是否释放?
 
if object=nil then
begin
//
end;
 
assigned()
 
if object=nil then
begin
object.free;
object:=nil;
end;
 
if assigned(object) then FreeAndNil(object);
 
[purple]各位大侠说的方法我都知道,但是我的类是线程类,在类中用freeOnTerminated
来自动free,但在vcl里面,用freeOnTerminated方法free的类是没有
用object:=nil;这一语句的。所以呢:
线程类自己free之后,object<>nil。
但是我又想判断object已经释放了。该用什么方法?
[/purple]

 
var
x:variant;
begin
x;=f.create;
if VarIsEmpty(x) then//
 
可能大家想到用线程类的waitfor方法,然后让线程结束之后,用object=nil
然后再用assigned()
可是这个线程类的调用在主线程,主线程使用waitfor显然是不好的啦。

还有什么好的方法吗?拜托各位大侠了。
能不能换一下思路。
比如通过判断object所指的内存空间是否为空来判断类实例是否free
 
to yitanhg
谢谢,我会试试你说的方法,然后再答复你
 
设置全局变量!
 
to yitanhg
你所说的:
var
x:variant;
begin
x;=f.create;
if VarIsEmpty(x) then//
x是variant,我的是自己定义的类,类型不匹配

to SuperJS
这是个方法,但不是好方法,我有几个线程类,每个类都设置一个全局变量,很麻烦。

最好的办法还是判断对象的内存空间是否为空,但如何判断???
 
campo
您要判定obj是不是有效
那么,一定有地方这样调用
xxx.obj
xxx是某个对象的实例
那么就在obj的Free之前把
xxx.obj=nil

如果是线程的话
在线程结束前把xxx.obj:=nil就可以了

你想要的方法我还不知道
 
to MrMengyi
您似乎没有理解我问题的意思,我的问题是这样的
定义一个线程类: TMyThread;

在界面里(Form1)某个按钮调用TMyThread
var
MyThread:TMyThread;
MyThread:=TMyThread.Create(True);
MyThread.FreeOnTerminated:=True;
...........
MyThread.Resume;

界面中的一个菜单,要根据MyThread这个类实例是否Free来作出不同的反应。

我不知道xxx.obj是什么意思,线程结束前MyThread:=nil是不行的




 
设置标记
 
to :我是帅哥
还是用全局变量,不是我所要的方法。
 
FreeOnTerminate 是 TThread 的一个属性。但是,不幸的是线程结束时,对象不会变成 nil。
您可以这样试试看,启动线程:
if MyThreadThrd = nil then
begin
MyThreadThrd := TMyThread.Create(true);
MyThreadThrd.FreeOnTerminate := true;
MyThreadThrd.Resume;
end;
线程执行部分:TMyThread.Execute
begin
// do your job
MyThread := nil;
end;

另外,线程同步用信号灯比较好,全文检索一下:“信号灯 AND 线程”吧。
 
你既然是高手,又认为DFW不怎么样,又何必来考大家呢?
 
这道题竟然惊动了yysun大侠,谢谢yysun的指点。
您的意思是不是说:在TMyThread.Execute里面可以对MyThread赋值为nil,
比如:
线程类的 TMyThread.Execute 可以:
begin
//.........
MyThread := nil;
end;
调用部分可以:
var
MyThread:TMyThread;

MyThread:=TMyThread.Create(True);
MyThread.FreeOnTerminated:=True;
MyThread.Resume;

另外:这个问题的实质其实是:
能不能通过对象的指针知道这个对象是否占有内存空间。
Delphi难道真的没有此类函数。
这样的话,只好用yysun大侠的办法了。





 
其实,前面大家已经回答你了,if assigned(object) 可以监测对象是否存在。
一般只做 object.free
对象是被释放了,但是 object 并不是 nil;
如果想监测的话,应该用 FreeAndNil(object)
来释放对象。
 
这个我是知道的,free是释放对象,对象的地址还保存在object里面,
freeAndNil可以既释放对象,又把指针赋值为nil,但遗憾的是vcl里面
释放线程类资源,不是用freeAndNil,而是用free,我想另辟途径,
才有此一问。我改写vcl试试。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
顶部