在窗体上放一个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.
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.
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.
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;
TmyThread.Create(true);
用Synchronize同步访问VCL不可能完全有你的效果
如果你这样就解决了,只不过效果要差些:
procedure TmyThread.Execute;
begin
Synchronize(myVoid);
end;
改为
procedure TmyThread.Execute;
begin
myVoid;
end;
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.