在线程中创建窗体卡死的问题 写了一个继承于TThread的线程类,在它的Execute方法中创建了窗体TForm1:Form1 := TForm1.Create(nil);这句代码在exe中卡死,而整个单元放到dll中却可以正常工作,为啥??? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一切vcl可视控件,都是非线程安全的,包括TFrom也是在线程中操作窗体,要放在Synchronize过程中procedure TMyThread.MyShowForm;begin Form1 := TForm.Create(Application); Form1.Show;end; procedure TMyThread.execute;begin Synchronize(MyShowForm);end; 但是在dll中,确实可以不用Synchronize,我也不知道为啥 加载dll和创建线程是不同的,加载dll是在进程中进行的,只会被加载一次,每个调用该dll的线程都会在内存中映射一份该dll,可以理解为该dll被映射到调用线程中,所以dll拥有的内存归调用线程所有,而创建新线程则不用解释了 vcl framework的主线程中处理消息,TForm是基于VCL的,vcl不是线程安全的。因此,在子线程中创建窗体是不对的,因为很多要处理的事情都不能正确处理,甚至窗体都画不出来。在子线程里面窗体tform的示例就像要在淡水河里养海鱼一样不靠谱。如果你要在子线程中窗口窗口,正确的方式应该是用windows api ,自己处理,包括注册窗口类,创建窗口,处理消息循环。 我是在dll中创建的线程,线程的Execute中创建的窗体 基本就是6喽的思路,自己处理消息,随便找个介绍winAPI创建窗口的书看看就行。看你Delphi板块都那么多3角了,InsideVCL总有吧,第一章的NativeWindowApp源码,它是在主线程中创建窗口,你把代码写在子线程中就得了。 线程同步的同步的问题,delphi自带线程类首先就说了关于vcl显示部分的要Synchronize 我线程中的窗口上有几个控件,用纯API的话,不好弄啊!!!现在只能暂时放到dll中!!! 自己写肯定麻烦喽...不过,你的需求是啥啊?放DLL里面,不是和放主程序里一样?都是在主线程里处理消息... 不一样,放在dll里可以正常用,线程里有自己的消息循环。 俺是说 DLL不一样是在 主线程里?干嘛还专门弄个DLL?安全?升级? 因为创建了窗体的线程放在主程序会卡,而放在dll不会卡,所以就放在dll中。我的问题就是,为什么放在dll中不会卡 你是把整个线程类都放DLL里了?窗体里面就“Form1 := TForm1.Create(nil);”,没有涉及Application操作,就行??? 是线程的Execute里头“Form1 := TForm1.Create(nil);”。dll导出了一个显示Form1的函数 水品有限,搞不出你那样DLL能正常的现象... delphi cxgrid 如何实现最小化到托盘? Delphi如何利用clientdataset编写CDS转XML的DLL 請問:如何在任何窗口响应热键??? QuickRep高手请进,我的分都给你!!急死我了!帮帮我吧!555 如何让dbgrid中第一列colum是序号,而且是动态的,急,时间紧,请各位大大援手。 请问:在VB下如何调用delphi写的EXE? 一个控件问题 解决了ThemeEngine闪烁问题的高手请进。。。 做个小程序,刷点参与分,还不错,一个小时有5000多分 Delphi官方的论坛木有?找不到,给个网址吧 大家用什么函数提取机器硬件参数用于注册的?
在线程中操作窗体,要放在Synchronize过程中
procedure TMyThread.MyShowForm;
begin
Form1 := TForm.Create(Application);
Form1.Show;
end;
procedure TMyThread.execute;
begin
Synchronize(MyShowForm);
end;
看你Delphi板块都那么多3角了,InsideVCL总有吧,第一章的NativeWindowApp源码,它是在主线程中创建窗口,你把代码写在子线程中就得了。
不过,你的需求是啥啊?放DLL里面,不是和放主程序里一样?都是在主线程里处理消息...
dll导出了一个显示Form1的函数