如题

解决方案 »

  1.   

    我好像也有这个问题,我主窗体中有个memo1的visible:=false;
    线程中我用memo1.visible:=true; 运行的时候一切正常线程一结束memo1就看不到了关闭程序的时候就出错,好像和你的问题一样,请高手告诉一下这个要怎么解决
      

  2.   

    Tmemo的visible设置,实际上是调用的TControl的SetVisible,而这个并没有按照windows的消息规则,发送一个ShowWindow的消息给EDIT实例。而是通过Perform调用了窗口过程,从而对VCL进行了调整。如此可能导致的结果是两个线程对同一个或多个VCL控件进行了操作,结果是不可预料的。
      

  3.   

    解决的办法是在线程当中通过Synchronize切换到主线程当中执行memo1.visible := true类似的操作。
      

  4.   

    做一下测试就了解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资源的变化。
      

  5.   

    标题有点歧义了, 你创建了,不要指望别人帮你释放, 而是要你自己写代码来释放,如果你写了线程free的时候自动释放你创建的vcl, 那自然就是会自动消失了, 如果没写那就是不会自动消失. 关键是看你怎么写咯
      

  6.   

    明显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}
    线程结束时所做的操作