线程问题(100分)

  • 主题发起人 主题发起人 woofer
  • 开始时间 开始时间
W

woofer

Unregistered / Unconfirmed
GUEST, unregistred user!
if MyThread = nil then
begin
MyThread := TReadData.Create(False);
MyThread.FreeOnTerminate := True;
end
else
begin
MyThread.Free;
MyThread.FreeOnTerminate := True;
end;
如上程序,MyThread可能自己运行结束,也可能由于设置MyThread.Terminated为True
而结束。
问题:
1。 MyThread运行结束后,MyThread是否Free了?
2。如果Free了,为什么程序还能运行到else
部分?
3。如果没有Free,为什么运行MyThread.Free会出错?
谢谢各位高手!
 
把你程序运行得上下文环境也写一下,
Thread.free 的具体操作是什么!
 
看DELPHI的DEMO目录
 
1。 MyThread运行结束后,MyThread是否Free了?
答案:只要你写了FreeOnTerminate := True就一定会Free。
2。如果Free了,为什么程序还能运行到else
部分?
答案:Free之后,MyThread仍然<>nil,所以能够运行到else
部分。
不要觉得奇怪:FMyThread已经Free了怎么还<>nil?任何对象都是这样,不信
你用TForm试试看:
Form1 := TForm.Create(nil);
Form1.Free;
if Form1 <> nil then
...
3。如果没有Free,为什么运行MyThread.Free会出错?
已经Free了,再运行MyThread.Free当然会出错。
 
我同意楼上的。
 

同意飞龙在天外
进来了就再说两句。
1.
MyThread.Free;
MyThread.FreeOnTerminate := True;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~这里这句是万千要不得的,不出错才怪。
2.
为了避免你的错误,你可在myThread.terminate后再加一句myThread:=nil,或可重载destroy,
inherited destroy再加一句self:=nil;后原因见楼上


 
释放掉了之后现成的指针内容没有清空为nil。所以你没办法执行到else
,这个问题我也遇到过,
用assigned也一样存在这个问题。
所以建议释放之后把 指针设置位 nil,
如果你想让线程结束之后自动释放,就没办法设为空了。
但是你可以在用一个全局变量表示线程是否释放掉了,或者用一个互斥元,
参见 CreateMutex,你只要判断这个胡斥元就知道线程是否释放掉了。
我也想知道是否有什么更好的办法,
 
多人接受答案了。
 
后退
顶部