线程里创建的VCL对象(Frame)会随线程的释放而消失吗?

shadowstar 2009-12-09 10:19:34
如题
...全文
119 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lengfengxiaodao 2009-12-10
  • 打赏
  • 举报
回复
明显VCL的线程类不会帮你释放你手动创建的VCL对象
VCL的线程类,只是CreateThread函数基础上加了 操作VCL对象的事件,放到主线程去执行
Create 函数只是创建了一个挂起的线程,

FreeThread := Thread.FFreeOnTerminate;
Result := Thread.FReturnValue;
Thread.DoTerminate;
Thread.FFinished := True;
SignalSyncEvent;
if FreeThread then Thread.Free;
{$IFDEF MSWINDOWS}
EndThread(Result);
{$ENDIF}
线程结束时所做的操作
Hexpate 2009-12-09
  • 打赏
  • 举报
回复
标题有点歧义了, 你创建了,不要指望别人帮你释放, 而是要你自己写代码来释放,如果你写了线程free的时候自动释放你创建的vcl, 那自然就是会自动消失了, 如果没写那就是不会自动消失. 关键是看你怎么写咯
僵哥 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jianxin882000 的回复:]
等高手
[/Quote]
做一下测试就了解

type
TMyThread = class(TThread)
protected
procedure Execute;override;
end;


procedure TMyThread.Execute;
var
f: TForm;
begin
self.FreeOnTerminate := true;
f := TForm.Create(Nil);
f.Show;
f.Free;//分别测试屏蔽和不屏蔽此行
end;


然后添加程序测试代码:

procedure TForm1.Button1Click(Sender: TObject);
var
t: TMyThread;
begin
t := TMyThread.Create(false);
end;


在屏蔽和不屏蔽Execute当中f.Free这行代码的两种状态下,打开任务管理器,切换到“进程”页,然后在“查看”菜单的“选择列...”当中选择“内存使用”和“GDI 对象”两项,然后查看其中的变化做出比较。

上面的测试是使用TForm,对于TFrame需要有一个可视的载体,否则不会有GDI资源的变化。
哈哈V大侠 2009-12-09
  • 打赏
  • 举报
回复
等高手
Hexpate 2009-12-09
  • 打赏
  • 举报
回复
不会
僵哥 2009-12-09
  • 打赏
  • 举报
回复
解决的办法是在线程当中通过Synchronize切换到主线程当中执行memo1.visible := true类似的操作。
僵哥 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 daijie_1 的回复:]
我好像也有这个问题,我主窗体中有个memo1的visible:=false;
线程中我用memo1.visible:=true; 运行的时候一切正常线程一结束memo1就看不到了关闭程序的时候就出错,好像和你的问题一样,请高手告诉一下这个要怎么解决
[/Quote]
Tmemo的visible设置,实际上是调用的TControl的SetVisible,而这个并没有按照windows的消息规则,发送一个ShowWindow的消息给EDIT实例。而是通过Perform调用了窗口过程,从而对VCL进行了调整。如此可能导致的结果是两个线程对同一个或多个VCL控件进行了操作,结果是不可预料的。
回味一下 2009-12-09
  • 打赏
  • 举报
回复
我好像也有这个问题,我主窗体中有个memo1的visible:=false;
线程中我用memo1.visible:=true; 运行的时候一切正常线程一结束memo1就看不到了关闭程序的时候就出错,好像和你的问题一样,请高手告诉一下这个要怎么解决
僵哥 2009-12-09
  • 打赏
  • 举报
回复
不会

5,387

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧