如何在一个单独线程中访问主线程中的窗体控件?

解决方案 »

  1.   

    在一个Form中从串口接收数据,使用一个单独的线程进行处理,然后显示在Form中,使用的CreateThread,如何操作.
      

  2.   

    对于vcl的操作 使用Sychronize即可, 但是记住, 这段Sychronize的代码竟可能的要简洁有效, 且尽量只有关于界面的操作, 例如Synchronize(NotifyProgress), 不然线程就失去优势了
      

  3.   

    直接写就是了://同步函数,由主程序来执行的方法
    procedure TThreadA.synchronizeMethod();
    begin
      //访问Form1的Button1控件
      form1.Button1.Enable=True;
    end;//线程主函数,访问同步函数
    Procedure TThreadA.Execute();
    begin
      Synchronize(synchronizeMethod)
    end;再有不明白的查你的Delphi 的帮助手册,在“索引”中输入“Synchronize method”,它的内容非常详细,并且有例子。
    建议楼主下次这类问题还是先查资料,如果不明白再提问吧
      

  4.   

    实在汗颜的很,在下E文不是一般的差,所以只有求助各位了。
    我在使用form1调用的时候,告诉我使用了调用类方法的方式调用方法,必须实例化之后才可以,这可能是我的代码哪个地方出差错了。
    在Form中的变量值是动态的,在线程中能直接同步吗?
      

  5.   


    procedure TForm1.Button6Click(Sender: TObject);
    var
      ID : Dword;
    begin
      CreateThread(nil,0,@MyFun,Memo1.Lines,0,ID);
    end;function MyFun(P:Pointer):Dword;StdCall;
    var
      I ,y : integer;
      strings : TStrings;
    begin
      I := 0;
      strings := Tstrings(P);
      while true do
      begin
        if I > 100 then Exit;
        strings.Add(IntToStr(I));
        Inc(I);  end;
    end;如果lz要直接用api操作看下上面这个列子,你要错做那个组件直接传到线程函数里面。
    但是建议lz用delphi的TTHread类,用法和楼上这么仁兄说的一样。Synchronize(主线程中的方法)
      

  6.   

    你不需要把Form中的变量在线程中去调用,你只要在form中定义1个方法,做你线程中想要做的事情,然后在线程中Synchronize(该方法)就可以了。
      

  7.   

    在一个Form中从串口接收数据,使用一个单独的线程进行处理,然后显示在Form中,使用的CreateThread,如何操作.
       
       1.首创建线程(发指令)
      2.串口接收事件里把数据反馈到界面
      

  8.   


    [Warning] Unit1.pas(35): Return value of function 'MyFun' might be undefined?
      

  9.   


    hjkto兄你该不会不知道线程函数吧,你这个玩笑开大了。呵呵
    我那上面只是没申明,加个申明就OK了。
    如果你认为是错误的,请指教。
      

  10.   

    1.在线程中用消息发出来,其他有界面的地方调用,跟设置回调一样的,这是最佳方法。
    2. Synchronize方法我并不推荐!
    3.kfcoffe 你的方法,能行,嘿嘿。你这是教人家直接底层写线程。哈哈。用法要教教人家了!