1,184
社区成员
![](https://csdnimg.cn/release/cmsfe/public/img/topic.427195d5.png)
![](https://csdnimg.cn/release/cmsfe/public/img/me.40a70ab0.png)
![](https://csdnimg.cn/release/cmsfe/public/img/task.87b52881.png)
![](https://csdnimg.cn/release/cmsfe/public/img/share-circle.3e0b7822.png)
type
TMy=class
public
procedure MyTest;
constructor Create(i:integer);
end;
TForm1 = class(TForm)
IdHTTP1: TIdHTTP;
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
Button3: TButton;
Button4: TButton;
Button5: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
function phonenum(i:integer):string;
{ Private declarations }
public
mn:TMy;
procedure MyTest;
procedure My(var msg:TMessage);message WM_My;
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{TMy}
constructor TMy.Create(i:integer);
begin
inherited Create;
end;
procedure TMy.MyTest;
begin
Form1.MyTest;
end;
{TForm1}
procedure TForm1.MyTest;
begin
Memo1.Lines.Add('TForm1 -- MyTest');
end;
procedure TForm1.My(var msg:TMessage);
begin
memo1.Lines.Add('WM_My');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
TAAThread.Create(false);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
mn:=TMy.Create(12);
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
mn.MyTest; //----------③
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
MyTest; //----------④
end;
Const
WM_My=WM_USER+123;
type
TAAThread = class(TThread)
private
{ Private declarations }
protected
FMessage: String;
procedure LogMessage;
procedure Execute; override;
end;
implementation
uses unit1;
procedure TAAThread.LogMessage;
begin
Form1.Memo1.Lines.Add(FMessage ); //---------------①
// PostMessage(Form1.Handle,WM_My,0,0); //---------------②
end;
procedure TAAThread.Execute;
var i:integer;
begin
FMessage:='Test';
for i:=0 to 100 do
begin
Synchronize(LogMessage);
end;
end;
type
TAAThread = class(TThread)
private
{ Private declarations }
FLogMessage:TStrings;
protected
FMessage: String;
procedure HookUI;
procedure Execute; override;
public
constructor Create(CreateSuspended: Boolean);
destructor Destroy(); override;
end;
implementation
uses unit1;
constructor TAAThread.Create(CreateSuspended: Boolean);;
begin
FLogMessage:=TStringList.Create;
inherited;
end;
destructor TAAThread.Destroy;
begin
FLogMessage.Free;
inherited;
end;
procedure TAAThread.HookUI;
begin
Form1.Memo1.Lines:=FLogMessage; //---------------①
// PostMessage(Form1.Handle,WM_My,0,0); //---------------②
end;
procedure TAAThread.Execute;
var i:integer;
begin
FMessage:='Test';
for i:=0 to 100 do
begin
FLogMessage.add('Log info');
end;
Synchroize(HookUI);
end;
for i:=0 to 100 do
begin
LogMessage;
end;
效果会怎么样?
for i:=0 to 100 do
begin
Synchronize(LogMessage);//当调用Synchronize时,就会suspend当前线程 ,这样的话,会频繁地在主线程与子线程之间做切换,就起不到线程应有的作用
end;