在窗体上放一个button和两个label,我想让两个label的caption通过两个线程来赋值,但是总得执行完第一个线程后再执行第二个,这还叫多线程么?郁闷!!代码如下,请高手指点。unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;  TmyThread=Class(TThread)
  public
    Lb:Tlabel;
    constructor Create(Lab:TLabel);
    procedure Execute;
    procedure myVoid;
  end;
  TmyThread2=Class(TThread)
  public
    Lb:Tlabel;
    constructor Create(Lab:TLabel);
    procedure Execute;
    procedure myVoid;
  end;var
  Form1: TForm1;
  T1:TmyThread;
  T2:TmyThread2;
implementation{$R *.dfm}constructor TmyThread.Create(Lab:Tlabel);
begin
  Lb := Lab;
  inherited Create(true);
  FreeOnTerminate := true;
end;procedure TmyThread.Execute;
begin
  Synchronize(myVoid);
end;procedure TmyThread.myVoid;
  var
    i:integer;
begin
  for i:=0 to 10000 do
  begin
    Application.ProcessMessages;
    Lb.Caption := InttoStr(i);
  end;
end;constructor TmyThread2.Create(Lab:Tlabel);
begin
  Lb := Lab;
  inherited Create(true);
  FreeOnTerminate := true;
end;procedure TmyThread2.Execute;
begin
  Synchronize(myVoid);
end;procedure TmyThread2.myVoid;
  var
    i:integer;
begin
  for i:=0 to 10000 do
  begin
    Application.ProcessMessages;
    Lb.Caption := InttoStr(i);
  end;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
  T1.execute;
  T2.Execute;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
  T1 := TmyThread.Create(Label1);
  T2 := TmyThread2.Create(Label2);
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
  T1.Terminate;
  T2.Terminate;
end;end.

解决方案 »

  1.   

    不会编译错误吧?记得button1,lable1,label2添加这三个控件
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Label1: TLabel;
        Label2: TLabel;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;  TmyThread=Class(TThread)
      private
        Lb:Tlabel;
      public
        procedure Execute;override;
        procedure myVoid;
      end;
    var
      Form1: TForm1;
      T1,T2:TmyThread;
    implementation{$R *.dfm}procedure TmyThread.Execute;
    begin
      Synchronize(myVoid);
    end;procedure TmyThread.myVoid;
      var
        i:integer;
    begin
      for i:=0 to 10000 do
      begin
        Application.ProcessMessages;
        Lb.Caption := InttoStr(i);
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      T1 := TmyThread.Create(false);
      T2 := TmyThread.Create(false);
      T1.Lb:=label1;T2.Lb:=label2;
      T1.FreeOnTerminate:=true;T2.FreeOnTerminate:=true;
      T1.Resume;T2.Resume;
    end;end.
      

  3.   

    改一下
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      T1 := TmyThread.Create(false);
      T2 := TmyThread.Create(false);
      T1.Lb:=label1;T2.Lb:=label2;
      T1.FreeOnTerminate:=true;T2.FreeOnTerminate:=true;
      T1.Resume;T2.Resume;
    end;
      

  4.   

    晕,什么也没改,对不起,应该是
    TmyThread.Create(true);
      

  5.   

    改为true一样,第一个跑了点,然后就停了,接着第二个跑到完,然后第一个再接着跑
      

  6.   

    就是了,两个中一个只跑了一半,我认为是application.ProcessMessages;的原因
      

  7.   

    如果没有这个我就看不到label在变化了啊
      

  8.   

    解决了:
    用Synchronize同步访问VCL不可能完全有你的效果
    如果你这样就解决了,只不过效果要差些:
    procedure TmyThread.Execute;
    begin
      Synchronize(myVoid);
    end;
    改为
    procedure TmyThread.Execute;
    begin
      myVoid;
    end;
      

  9.   

    当然还是要application.ProcessMessages
      

  10.   

    好了,完整的代码:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Label1: TLabel;
        Label2: TLabel;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;  TmyThread=Class(TThread)
      private
        Lb:Tlabel;
      public
        procedure Execute;override;
        procedure myVoid;
      end;
    var
      Form1: TForm1;
      T1,T2:TmyThread;
    implementation{$R *.dfm}procedure TmyThread.Execute;
    begin
      myVoid;
    end;procedure TmyThread.myVoid;
      var
        i:integer;
    begin
      for i:=0 to 10000 do
      begin
        Lb.Caption := InttoStr(i);
        application.ProcessMessages;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      T1 := TmyThread.Create(true);
      T2 := TmyThread.Create(true);
      T1.Lb:=label1;T2.Lb:=label2;
      T1.FreeOnTerminate:=true;
      T2.FreeOnTerminate:=true;
      T1.Resume;T2.Resume;
    end;end.