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 ; // 这个 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 := ; // 默认间隔时间为 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

最新文章

  1. S5PV210_串行通信
  2. IO通道
  3. iOS不使用JSONKit做Dic到JsonString的转换
  4. 20条Linux命令面试问答
  5. python中mysqldb的用法
  6. Pipe
  7. 解决ScrollView与ListView事件冲突
  8. PHP计算某个目录大小的方法
  9. hdu 4619 Warm up 2 网络流 最小割
  10. (转载)Eclipse基金会涉足物联网,M2M标准是否已获东风?
  11. mysql perl 抓取update语句
  12. vc++ internet
  13. 【转】android windowSoftInputMode
  14. golang获取命令行参数
  15. 第一篇 入门必备 (Android学习笔记)
  16. MySQL Server has gone away报错原因汇总分析(转自:http://cenalulu.github.io/mysql/mysql-has-gone-away/)
  17. “全栈2019”Java异常第十章:throw与throws区别详解
  18. Windows ->> Windows下安装MSI程序遇到2503和2502错误
  19. 数组去重 && 快速排序 && 数组中重复元素最多的 && 深拷贝
  20. 洛谷——P2626 斐波那契数列(升级版)矩阵

热门文章

  1. android Unable to resolve target 'android-XX'错误和conversion to dalvik format failed with error 1错误
  2. 移动端Web App自适应布局探索
  3. DataTable类
  4. SQL Server 2008空间数据应用系列六:基于SQLCRL的空间数据可编程性
  5. Oleg Sych - » Pros and Cons of T4 in Visual Studio 2008
  6. [英国][记录][战争中的世界:二战全史(26集)][BD-MKV/58G][中英双字][经典收藏]
  7. Esper学习之六:EPL语法(二)
  8. AAC ADTS解析
  9. .NET 基础串讲
  10. android 数据存储之SharePreference 的几种方式