一共有两个Form,一个是主界面,一个是全局变量的NewForm,NewForm的初始状态Visible:=Flase;在主界面初始化时FormCreate进程内调用NewForm.Create,主界面出来后,用一个主界面上的ButtonClick进程来开启一个新的线程TestThread,在这个线程里用NewForm.Visible:=True;让副界面可见,然后这个线程就结束,接着关闭主界面,在主界面的FormClose进程里调用NewForm.Free,完了,出问题......窗口句柄无销,最奇怪的是,把线程里的NewForm.Visible:=True;屏蔽掉,做同样的操作,就没有问题,这是什么原因啊??
BTW:我的代码在公司里,家里没装delphi,如果还有疑问的话我可以把代码贴上来

解决方案 »

  1.   

    一直没上网,暂时没有看到你的回复,我在Create()里填过两个界面的变量,甚至填过nil,但都是一样的效果,因为我们公司不能上互联网,只能在家里发帖,我明天上班把精简过的代码考回来帖上大家看看。
      

  2.   

    在windows下窗口是对应到线程的,如果线程销毁了那么该线程下所有窗口的handle都同时销毁了。
    关键看你的form.handle是不是在线程中创建的。
    你在主线程中form.Create而在子线程中form.visible := true不是一个好主意。因为你无法确定该form.handle会不会在子线程中创建(如果是在子线程中创建的话你麻烦了,首先必须在子线程中建立消息循环并分发消息--否则该form的所有消息都会丢失,包括form的刷新都不会正常,其次有无数可能产生和主线程的访问冲突并引起程序崩溃--因为delphi的form设计时就根本没有考虑在多线程下运行)。在delphi下,form对应的windows的hwnd的创建是在你第一次使用到form.handle时。所以如果你没有在form.Create时引用到form.handle的话该form不会创建handle(而引用form.handle则有无数种情况存在,比如设置form的某些属性,比如设置某个子控件的属性等等都可能引用到form.handle并创建对应的windows的hwnd)。
    在子线程中设置form.visible并不一定表示该form.handle会在子线程中创建,主要看form.Create时是不是引用了form.handle.
      

  3.   

    楼上的说的没错,确实如果我不关闭主程序,而是再次使用某些操作,这个NewForm的显示就会不正常,比如刷新就不正常,我的进度条也不能动了,但后台的处理还是在继续。办公室用的delphi6,我刚找了个delphi7的试了一下,好象就没有这种问题了。如果按楼上的说法,是否只要能够在主线程里调用了form.handle,就可以确保子线程的正确运行,比如说先用一个Visible:=True;,再Visible:=False;(呵呵,好象比较笨)。
    同时,我也试过在子线程里创建一个新的NewForm,但一进线程任务就报告canvas出错,但这个调试的还不完全,不能说和上面的有关。
      

  4.   

    不推荐在子线程中创建form也不推荐在子线程中操作form, 因为form和全局变量Application结合太紧密了,你无法得知会不会引起线程冲突。