在主线程中,定义一个threadtmp: TTreadXXX全局线程对象;创建一个线程时,把主线程中的一个VCL控件的句柄传入线程中,在线程中给VCL控件写数据,这里是否要加Synchronize进行同步,如果加了这个同步,就会出现主线程一直等待,这样线程就起不到作用。请问如何解决线程对主线程中的一个VCL控件写数据时,主线程又能正常运行?

解决方案 »

  1.   

    vcl控件都不支持多线程,所以你在线程里面调用vcl,需要同步一下。
      

  2.   

    是要加Synchronize系统一直等待?
    不会吧?代码贴出来看看
      

  3.   

    你还可以用在线程之间使用消息同步以替代TThread.Synchronize()方法。
    可以用SendMessage()或PostMessage()来发送消息
      

  4.   

    这是一个简单的代码,你看看Unit Unit1;InterfaceUses
       Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
       Dialogs, StdCtrls;Type
       TForm1 = Class(TForm)
          Edit1: TEdit;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
       private
          { Private declarations }
       public
          { Public declarations }
       End;
       TTestThread = Class(TThread)
       private
          count: integer;
       public
          Procedure getcount;
          Procedure execute; override;
       End;
    Var
       Form1            : TForm1;Implementation{$R *.dfm}{ TTestThread }Procedure TTestThread.execute;
    Var
       i                : integer;
    Begin
       Inherited;
       FreeOnTerminate:=true;
       For i := 1 To 10000000 Do
          Begin
          if Terminated then break;
            inc(count);
            Synchronize(getcount);
          End;
    End;Procedure TTestThread.getcount;
    Begin
       form1.edit1.Text := inttostr(count);
    End;procedure TForm1.Button1Click(Sender: TObject);
    var mythread:TTestThread;
    begin
      mythread:=TTestThread.Create(false);
    end;End.
      

  5.   

    要Synchronize,一定要同步。你也可以用消息:就是在线程在把结束算好(处理好),然后用消息发给Component~~~~~~~~~~~~