zoukankan      html  css  js  c++  java
  • Delphi 线程Timer (TThreadTimer)

    delphi 自带的Timer控件,使用方便,但它的 OnTimer 事件是在主线程中引发的。

    如果在事件中执行较耗时的代码,会引起主界面假死。故实现一个线程的Timer就有必要了。

    TThreadTimer 基于 TSimpleThread 继承而来。

    本例源码下载

      1 unit uThreadTimer;
      2 
      3 interface
      4 
      5 uses
      6   uSimpleThread;
      7 
      8 type
      9 
     10   TThreadTimer = class; // 提前申明 TThreadTimer 是一个类
     11 
     12   TOnThreadTimer = procedure(Sender: TThreadTimer) of object;
     13   // 此处就可以引用 TThreadTimer,这种写法避免将 Sender 写为 TObject;
     14   // 为什么要写这个 sender ,主要是为了区别是谁引发了事件,并且 sender 上可以带参数
     15   // 方便进一步使用
     16 
     17   TThreadTimer = Class(TSimpleThread)
     18   private
     19     FInterval: Cardinal;
     20     FOnThreadTimer: TOnThreadTimer;
     21 
     22     procedure CountTimer;
     23     procedure DoCountTimer;
     24     procedure SetInterval(val: Cardinal);
     25     procedure SetOnThreadTimer(val: TOnThreadTimer);
     26 
     27     procedure DoOnThreadTimer; // 请学习此写法
     28 
     29   public
     30     constructor Create(AAllowActiveX: Boolean = false); // AAlowActiveX 在父类中有说明
     31     procedure StartThread; override; // 重载父类的 StartThread
     32     property Interval: Cardinal read FInterval write SetInterval default 1000;
     33 
     34     // 这个 default 1000 是给人看的,不会产生实际作用。
     35     // 故还需要在 Create 事件中指定 FInterval:=1000;
     36     // 如果可视化控件的 published 块中,此值会显示在属性编辑框中
     37 
     38     property OnThreadTimer: TOnThreadTimer read FOnThreadTimer write SetOnThreadTimer;
     39 
     40   End;
     41 
     42 implementation
     43 
     44 { TThreadTimer }
     45 
     46 procedure TThreadTimer.CountTimer;
     47 begin
     48   ExeProcInThread(DoCountTimer);
     49   // 将 DoCountTimer 置入线程中去执行
     50   // 这是 TSimpleThread 的用法
     51 end;
     52 
     53 constructor TThreadTimer.Create(AAllowActiveX: Boolean);
     54 begin
     55   inherited Create(AAllowActiveX);
     56   FInterval := 1000; // 默认间隔时间为 1 秒
     57 end;
     58 
     59 procedure TThreadTimer.DoCountTimer;
     60 begin
     61 
     62   if WaitStop then // 这是父类的一个属性,表示线程现在需要停止了。
     63     exit;
     64 
     65   SleepExceptStopped(FInterval); // sleep 指定的时间,如果中途接到退出指令,则马上响应。
     66   // 父类中有源码,可看一看
     67 
     68   if not WaitStop then
     69   begin
     70     DoOnThreadTimer; // 引发时间到事件
     71   end;
     72 
     73   CountTimer; // 再次在线程中执行 DoCountTimer;
     74   // 父类已经设计好了,就这样简单地调用,即可实现在线程中执行本过程,但又不会引起“递归”
     75 
     76 end;
     77 
     78 procedure TThreadTimer.DoOnThreadTimer;
     79 begin
     80   if Assigned(FOnThreadTimer) then
     81     FOnThreadTimer(Self);
     82   // 把这句写为一个过程,看似啰嗦,但为了程序可读性,是值得的。
     83 end;
     84 
     85 procedure TThreadTimer.StartThread;
     86 begin
     87   inherited;
     88   CountTimer; // 启动计时
     89 end;
     90 
     91 procedure TThreadTimer.SetInterval(val: Cardinal);
     92 begin
     93   FInterval := val;
     94 end;
     95 
     96 procedure TThreadTimer.SetOnThreadTimer(val: TOnThreadTimer);
     97 begin
     98   FOnThreadTimer := val;
     99 end;
    100 
    101 end.
    uThreadTimer.pas

    附:delphi 进阶基础技能说明

  • 相关阅读:
    toj 2975 Encription
    poj 1797 Heavy Transportation
    toj 2971 Rotating Numbers
    zoj 2281 Way to Freedom
    toj 2483 Nasty Hacks
    toj 2972 MOVING DHAKA
    toj 2696 Collecting Beepers
    toj 2970 Hackle Number
    toj 2485 Card Tric
    js页面定位,相关几个属性
  • 原文地址:https://www.cnblogs.com/lackey/p/5411389.html
Copyright © 2011-2022 走看看