写了一个继承于TThread的线程类,在它的Execute方法中创建了窗体TForm1:
Form1 := TForm1.Create(nil);这句代码在exe中卡死,而整个单元放到dll中却可以正常工作,为啥???

解决方案 »

  1.   

    一切vcl可视控件,都是非线程安全的,包括TFrom也是
    在线程中操作窗体,要放在Synchronize过程中
    procedure TMyThread.MyShowForm;
    begin
      Form1 := TForm.Create(Application);
      Form1.Show;
    end;
     
    procedure TMyThread.execute;
    begin
      Synchronize(MyShowForm);
    end;
      

  2.   

    但是在dll中,确实可以不用Synchronize,我也不知道为啥
      

  3.   

    加载dll和创建线程是不同的,加载dll是在进程中进行的,只会被加载一次,每个调用该dll的线程都会在内存中映射一份该dll,可以理解为该dll被映射到调用线程中,所以dll拥有的内存归调用线程所有,而创建新线程则不用解释了
      

  4.   

    vcl framework的主线程中处理消息,TForm是基于VCL的,vcl不是线程安全的。因此,在子线程中创建窗体是不对的,因为很多要处理的事情都不能正确处理,甚至窗体都画不出来。在子线程里面窗体tform的示例就像要在淡水河里养海鱼一样不靠谱。如果你要在子线程中窗口窗口,正确的方式应该是用windows api ,自己处理,包括注册窗口类,创建窗口,处理消息循环。
      

  5.   

    我是在dll中创建的线程,线程的Execute中创建的窗体
      

  6.   

    基本就是6喽的思路,自己处理消息,随便找个介绍winAPI创建窗口的书看看就行。
    看你Delphi板块都那么多3角了,InsideVCL总有吧,第一章的NativeWindowApp源码,它是在主线程中创建窗口,你把代码写在子线程中就得了。
      

  7.   

    线程同步的同步的问题,delphi自带线程类首先就说了关于vcl显示部分的要Synchronize
      

  8.   

    我线程中的窗口上有几个控件,用纯API的话,不好弄啊!!!现在只能暂时放到dll中!!!
      

  9.   

    自己写肯定麻烦喽...
    不过,你的需求是啥啊?放DLL里面,不是和放主程序里一样?都是在主线程里处理消息...
      

  10.   

    不一样,放在dll里可以正常用,线程里有自己的消息循环。
      

  11.   

    俺是说 DLL不一样是在 主线程里?干嘛还专门弄个DLL?安全?升级?
      

  12.   

    因为创建了窗体的线程放在主程序会卡,而放在dll不会卡,所以就放在dll中。我的问题就是,为什么放在dll中不会卡
      

  13.   

    你是把整个线程类都放DLL里了?窗体里面就“Form1 := TForm1.Create(nil);”,没有涉及Application操作,就行???
      

  14.   

    是线程的Execute里头“Form1 := TForm1.Create(nil);”。
    dll导出了一个显示Form1的函数
      

  15.   

    水品有限,搞不出你那样DLL能正常的现象...