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.