Timer控件在创建时调用了SetTimer函数,用SetTimer函数创建计时器的线程必须有一个消息循环,无论你的计时器是向窗口发送消息还是调用计时器过程.
这样改一下:
unit Unit2;interfaceuses
Classes, ExtCtrls, Math, SysUtils, Windows;type
TMyThread = class(TThread)
private
{ Private declarations }
procedure FTimerOnTimer(Sender: TObject);
procedure SetCaption1;
procedure SetCaption2;
protected
procedure Execute; override;
public
constructor Create;
destructor Destroy;override;
end;implementation
uses Unit1;
{ TMyThread }constructor TMyThread.Create;
begin
inherited Create(False);
FreeOnTerminate := True;
end;destructor TMyThread.Destroy;
begin
inherited;end;procedure TMyThread.Execute;
var
ATimer:TTimer;
AMsg: TMsg;
begin
Randomize;
ATimer := TTimer.Create(nil);
ATimer.OnTimer := FTimerOnTimer;
ATimer.Interval := 500;
ATimer.Enabled := True;
while not Terminated do
begin
//加上下面这五行(消息循环)
while PeekMessage(AMsg,0,0,0,PM_REMOVE) do
begin
TranslateMessage(AMsg);
DispatchMessage(AMsg);
end;
Synchronize(SetCaption2);
end;
ATimer.Free;
end;procedure TMyThread.FTimerOnTimer(Sender: TObject);
begin
Synchronize(SetCaption1);
end;procedure TMyThread.SetCaption1;
begin
Form1.Label1.Caption := IntToStr(Random(100));
end;procedure TMyThread.SetCaption2;
begin
Form1.Label2.Caption := IntToStr(Random(100));
end;end.
这样改一下:
unit Unit2;interfaceuses
Classes, ExtCtrls, Math, SysUtils, Windows;type
TMyThread = class(TThread)
private
{ Private declarations }
procedure FTimerOnTimer(Sender: TObject);
procedure SetCaption1;
procedure SetCaption2;
protected
procedure Execute; override;
public
constructor Create;
destructor Destroy;override;
end;implementation
uses Unit1;
{ TMyThread }constructor TMyThread.Create;
begin
inherited Create(False);
FreeOnTerminate := True;
end;destructor TMyThread.Destroy;
begin
inherited;end;procedure TMyThread.Execute;
var
ATimer:TTimer;
AMsg: TMsg;
begin
Randomize;
ATimer := TTimer.Create(nil);
ATimer.OnTimer := FTimerOnTimer;
ATimer.Interval := 500;
ATimer.Enabled := True;
while not Terminated do
begin
//加上下面这五行(消息循环)
while PeekMessage(AMsg,0,0,0,PM_REMOVE) do
begin
TranslateMessage(AMsg);
DispatchMessage(AMsg);
end;
Synchronize(SetCaption2);
end;
ATimer.Free;
end;procedure TMyThread.FTimerOnTimer(Sender: TObject);
begin
Synchronize(SetCaption1);
end;procedure TMyThread.SetCaption1;
begin
Form1.Label1.Caption := IntToStr(Random(100));
end;procedure TMyThread.SetCaption2;
begin
Form1.Label2.Caption := IntToStr(Random(100));
end;end.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货