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 进阶基础技能说明

  • 相关阅读:
    在LINUX中 用Ctrl+z挂起的命令怎么切回到原任务的命令窗口
    Linux cat 命令
    关于awk中NR、FNR、NF、$NF、FS、OFS的说明
    Linux如何在vim里搜索关键字
    Social Infrastructure Information Systems Division, Hitachi Programming Contest 2020 D题题解
    AGC043 B题题解
    Social Infrastructure Information Systems Division, Hitachi Programming Contest 2020 C题题解
    JOISC2020 自闭记
    Dwango Programming Contest 6th E 题解
    CF1320 Div1 D.Reachable Strings 题解
  • 原文地址:https://www.cnblogs.com/lackey/p/5411389.html
Copyright © 2011-2022 走看看