这个多线程怎么不同步执行? ( 积分: 10 )

  • 主题发起人 Yohoho999
  • 开始时间
Y

Yohoho999

Unregistered / Unconfirmed
GUEST, unregistred user!
我在D6+Winxp SP2下编写了以下程序,请问两个Edit的内容怎么不同步更新呢?
unit test1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
TrackBar1: TTrackBar;
TrackBar2: TTrackBar;
Label3: TLabel;
Label4: TLabel;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TMyThread=class(tthread)
Fm,Fn:integer;
FEdit:TEdit;
procedure Show;
constructor create(m,n:Integer;myEdit:TEdit);
procedure execute;override;
end;


var
Form1: TForm1;

implementation

{$R *.dfm}

{ TMyThread }

constructor TMyThread.create(m, n: Integer; myEdit: TEdit);
begin
inherited create(false);
Fm:=m;
Fn:=n;
FEdit:=myEdit;
freeonterminate:=true; // 线程终止时自动删除对象,
end;

procedure TMyThread.execute;
begin
synchronize(show); // 线程调用同步
end;

procedure TMyThread.Show;
var
i:Integer;
begin
for i:=Fm to Fn do
begin
FEdit.Text:='循环到:'+IntToStr(i);
FEdit.Update;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
T1,T2:TmyThread;
begin
Edit1.Text:='';
Edit2.Text:='';
T1:=TMyThread.create(1,20000,Edit1);
T2:=TMyThread.create(20001,50000,Edit2);
end;

end.
 
我在CSDN获得了答案,与各位分享。
看来大富翁的朋友要多努力了。


把循环放在execute中,而不是Show中:

type
TMyThread=class(tthread)
Fm,Fn: Integer;
FEdit: TEdit;
i : Integer;
procedure Show;
constructor create(m,n:Integer;myEdit:TEdit);
procedure execute;override;
end;

procedure TMyThread.execute;
begin
for i := Fm to Fn do
synchronize(show);
end;

procedure TMyThread.Show;
begin
FEdit.Text:= '循环到: ' + IntToStr(i);
FEdit.Update;
end;

我又加了几句代码,用GetTickcount测试了在用多线程(如上代码)和在非多线程(如下)代码下执行的时间,发现在非多线程下的效率还要快些。

我的疑惑是:还有必要使用多线程吗?(费话,肯定有必要了)那在哪些情况下需要用多线程来实现呢?
 
顶部