Delphi 線程Timer (TThreadTimer)


delphi 自帶的Timer控件,使用方便,但它的 OnTimer 事件是在主線程中引發的。

如果在事件中執行較耗時的代碼,會引起主界面假死。故實現一個線程的Timer就有必要了。

TThreadTimer 基於 TSimpleThread 繼承而來。

本例源碼下載

unit uThreadTimer;

interface

uses
  uSimpleThread;

type

  TThreadTimer = class; // 提前申明 TThreadTimer 是一個類

  TOnThreadTimer = procedure(Sender: TThreadTimer) of object;
  // 此處就可以引用 TThreadTimer,這種寫法避免將 Sender 寫為 TObject;
  // 為什么要寫這個 sender ,主要是為了區別是誰引發了事件,並且 sender 上可以帶參數
  // 方便進一步使用

  TThreadTimer = Class(TSimpleThread)
  private
    FInterval: Cardinal;
    FOnThreadTimer: TOnThreadTimer;

    procedure CountTimer;
    procedure DoCountTimer;
    procedure SetInterval(val: Cardinal);
    procedure SetOnThreadTimer(val: TOnThreadTimer);

    procedure DoOnThreadTimer; // 請學習此寫法

  public
    constructor Create(AAllowActiveX: Boolean = false); // AAlowActiveX 在父類中有說明
    procedure StartThread; override; // 重載父類的 StartThread
    property Interval: Cardinal read FInterval write SetInterval default 1000;

    // 這個 default 1000 是給人看的,不會產生實際作用。
    // 故還需要在 Create 事件中指定 FInterval:=1000;
    // 如果可視化控件的 published 塊中,此值會顯示在屬性編輯框中

    property OnThreadTimer: TOnThreadTimer read FOnThreadTimer write SetOnThreadTimer;

  End;

implementation

{ TThreadTimer }

procedure TThreadTimer.CountTimer;
begin
  ExeProcInThread(DoCountTimer);
  // 將 DoCountTimer 置入線程中去執行
  // 這是 TSimpleThread 的用法
end;

constructor TThreadTimer.Create(AAllowActiveX: Boolean);
begin
  inherited Create(AAllowActiveX);
  FInterval := 1000; // 默認間隔時間為 1 秒
end;

procedure TThreadTimer.DoCountTimer;
begin

  if WaitStop then // 這是父類的一個屬性,表示線程現在需要停止了。
    exit;

  SleepExceptStopped(FInterval); // sleep 指定的時間,如果中途接到退出指令,則馬上響應。
  // 父類中有源碼,可看一看

  if not WaitStop then
  begin
    DoOnThreadTimer; // 引發時間到事件
  end;

  CountTimer; // 再次在線程中執行 DoCountTimer;
  // 父類已經設計好了,就這樣簡單地調用,即可實現在線程中執行本過程,但又不會引起“遞歸”

end;

procedure TThreadTimer.DoOnThreadTimer;
begin
  if Assigned(FOnThreadTimer) then
    FOnThreadTimer(Self);
  // 把這句寫為一個過程,看似啰嗦,但為了程序可讀性,是值得的。
end;

procedure TThreadTimer.StartThread;
begin
  inherited;
  CountTimer; // 啟動計時
end;

procedure TThreadTimer.SetInterval(val: Cardinal);
begin
  FInterval := val;
end;

procedure TThreadTimer.SetOnThreadTimer(val: TOnThreadTimer);
begin
  FOnThreadTimer := val;
end;

end.

uThreadTimer.pas

 

附:delphi 進階基礎技能說明

http://www.cnblogs.com/lackey/p/5411389.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM