我有个函数如:CreateListView;
在主线程里面执行正常,但是一反倒其他线程里面去,那么就会程序创建失败(没显示出创建乐得组件出来),
用了sychrosize虽然没出现什么异常,但是他只支持 过程参数 传递进去,用 函数 不能传递进去,请问改怎么办?
我要执行的那个 过程是需要返回值的。

解决方案 »

  1.   

    不知道你是动态创建控件的还是地址传递的
    一般可以把ListView放在主窗体上,然后把地址传递到线程中
    代码看考:  TMyThread = class(TThread)
      private
        Lv: TListView;
      public
        
        constructor Create(ALv: TListView);
        destructor Destroy; override;
      end;  constructor TMyThread.Create(ALv: TListView);
      begin
        inherited Create;    //初始化设置
         Lv := ALv;
      end;  //主窗体单元
      MyThread := TMyThread.Create(frmMain.Lv);
      

  2.   

    加入这个函数
    function CreateListView: LongBool;//这是个函数
    begin
      //这里的代码是创建一个TListView,返回创建成功或者失败
    end;
    我在线程的Execute过程里面写代码
    var
      vBool: LongBool;
    BEGIN
      vBool:= CreateListView;//这样会创建失败,
      //使用procedure TThread.Synchronize(Method: TThreadMethod);就能创建成功
      //如下,但是CreateListView这个函数必须改成过程procedure,也就是使用了Synchronize就不能得到返回值了,请问怎么办? 
      Synchronize(CreateListView);
      
      
    END;
      

  3.   

    不建议在线程中动态创建VCL可视控件
    你可以创建TList来存储数据,窗体上的TListView显示数据
      

  4.   

    哦,谢谢楼上,请问怎么 创建TList来存储数据 ?
      

  5.   

    关键看你想要存什么样的数据,队列对象有很多!每一种都适应不同的需要!
    TList, TStringList, THashStringList。
      

  6.   

    居然敢在线程里创建TListView :0
      

  7.   

    VCL组件不是线程安全的,在子线程中即时创建出来了也是有漏洞可能异常的。
    用了sychrosize是子线程发消息给主线程,让主线程执行改方法,因此达不到在开线程的效果。子线程的目的一般是有费时的操作(如数据处理、网络等待)放到子线程处理,处理完毕后使用sychrosize发消息给主线程,让其将处理结果显示在界面上。