比如我要开发一个时钟的控件类,派生自TGraphicControl,具体在其Paint里面画时钟,然后在这个类里添加了派生自TThread的多线程类,想要以线程来每秒重画时钟,大概如下
TimeThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure DoEverySecond;
  end;
 TClock = class(TGraphicControl)
 private
  FTimeThread: TimeThread;
  procedure EverySecondDraw();
 end;
procedure TimeThread.DoEverySecond;
begin
  {如何在这里面调用TClock的函数EverySecondDraw}
end;
procedure TimeThread.Execute;
begin
  FreeOnTerminate := True;
  while not Terminated do
  begin
    Synchronize(DoEverySecond);
    Sleep(1000);
  end;
end;
不知道我上面的思路有没有错,但是我不懂怎么调用自定义的控件类TClock去重画时钟?

解决方案 »

  1.   

    恩有啊,我是在控件创建的时候,创建启动线程的,但是我不知道线程体函数那边怎么发消息告诉Clock说“已经过1秒了,该刷新时钟了”,所以特请教下。
    constructor TClock.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FTimeThread := TimeThread.Create(False);
    end;
      

  2.   

    自己解决了。主要是传递事件
      TimeThread = class(TThread)
      private
        FOnExecute: TNotifyEvent;
      protected
        procedure DoExecute;
        procedure Execute; override;
      public
        property OnExecute: TNotifyEvent read FOnExecute write FOnExecute;
      end;
    实现
    procedure TimeThread.DoExecute;
    begin
      if Assigned(FOnExecute) then
        FOnExecute(Self);
    end;procedure TimeThread.Execute;
    begin
      FreeOnTerminate := True;
      while not Terminated do
      begin
        Synchronize(DoExecute);
        Sleep(1000);
      end;
    end;
    而组件类要使用这个线程的话,得先包含他的对象,然后赋事件给线程体。
      TClock = class(TGraphicControl)
      private
          procedure EverySecondDraw(sender: TObject);
      protected
        procedure Paint; override;
      public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      published
        {```````}
     end;
    创建时
    constructor TClock.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FTimeThread := TimeThread.Create(True);
      FTimeThread.OnExecute := EverySecondDraw;
      FTimeThread.Resume;
    end;