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

Delphi 线程Timer (TThreadTimer)的更多相关文章

  1. TMsgThread, TCommThread -- 在delphi线程中实现消息循环

    http://delphi.cjcsoft.net//viewthread.php?tid=635 在delphi线程中实现消息循环 在delphi线程中实现消息循环 Delphi的TThread类使 ...

  2. TMsgThread, TCommThread -- 在delphi线程中实现消息循环(105篇博客,好多研究消息的文章)

    在delphi线程中实现消息循环 在delphi线程中实现消息循环 Delphi的TThread类使用很方便,但是有时候我们需要在线程类中使用消息循环,delphi没有提供.   花了两天的事件研究了 ...

  3. Delphi线程定时器TThreadedTimer及用法--还有TThreadList用法可以locklist

    Delphi线程定时器 - -人生如歌- - 博客园http://www.cnblogs.com/zhengwei0113/p/4192010.html (* 自己编写的线程计时器,没有采用消息机制, ...

  4. delphi 线程教学第六节:TList与泛型

    第六节: TList 与泛型   TList 是一个重要的容器,用途广泛,配合泛型,更是如虎添翼. 我们先来改进一下带泛型的 TList 基类,以便以后使用. 本例源码下载(delphi XE8版本) ...

  5. 线程 Timer TimerTask 计时器 定时任务 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  6. delphi 线程教学第二节:在线程时空中操作界面(UI)

    第二节:在线程时空中操作界面(UI)   1.为什么要用 TThread ?   TThread 基于操作系统的线程函数封装,隐藏了诸多繁琐的细节. 适合于大部分情况多线程任务的实现.这个理由足够了吧 ...

  7. delphi 线程教学第一节:初识多线程

    第一节:初识多线程   1.为什么要学习多线程编程?   多线程(多个线程同时运行)编程,亦可称之为异步编程. 有了多线程,主界面才不会因为耗时代码而造成“假死“状态. 有了多线程,才能使多个任务同时 ...

  8. 多线程的基本概念和Delphi线程对象Tthread介绍

    多线程的基本概念和Delphi线程对象Tthread介绍 作者:xiaoru    WIN 98/NT/2000/XP是个多任务操作系统,也就是:一个进程可以划分为多个线程,每个线程轮流占用CPU运行 ...

  9. Delphi线程的终止

    当线程对象的Execute()执行完毕,我们就认为此线程终止了.这时候,它会调用Delphi的一个标准例程EndThread(),这个例程再调用API函数ExitThread().由ExitThrea ...

随机推荐

  1. VS2010常用的调试方法

    1.一直以来都没用过command window, F5以后可以这样用,直接对一个函数,或者变量做模块测试 以下还有一些常用的技巧: 1 悬停鼠标查看表达式值 调试是很有挑战性的.比如在函数内逐步运行 ...

  2. python实现词法分析

    #请先安装Ply # -*- coding: utf-8 -*- #------------------------------------------------------------------ ...

  3. mosquitto在Linux环境下的部署/安装/使用/测试

    mosquitto在Linux环境下的部署 看了有三四天的的源码,(当然没怎么好好看了),突然发现对mosquitto的源码有了一点点感觉,于是在第五天决定在Linux环境下部署mosquitto. ...

  4. LLinux系统编程(10)——进程间通信之管道

    管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别.有名管道叫named ...

  5. Google street、Google satellite 、百度地图Iframe切换桥接JS

    1.地图切换方法 注意:父页面访问Iframe页面JS方法需根据Iframe的名字来调用如:named "mapIfame" 即 mapIfame.window.iframeFun ...

  6. tc令牌桶限速心得

    一.实验拓扑与实验现象 实验拓扑如图所示,在①号机上发送数据,③号机上接受数据,同时在④号机的eth1与eth2网口限制速率为115200kbps,命令如下 tc qdisc add dev eth1 ...

  7. java-四个线程修改一个变量

    package 经典; public class 四个线程 { private int j=10; /** * @param args */ public static void main(Strin ...

  8. 代码中实际运用memcached——java

    以下文章取自:http://jameswxx.iteye.com/blog/1168711 memcached的java客户端有好几种,http://code.google.com/p/memcach ...

  9. QUARTZ CRON

    本文来自:http://www.blogjava.net/crazycy/archive/2013/06/06/400287.html 每次使用Quartz Cron的时候都要去查manual doc ...

  10. ZendStudio快捷键 注释的快捷键

    注:本文省略“通用快捷键”描述,诸如:ctrl+N=新建,ctrl+O=打开,ctrl+C=复制,ctrl+V,ctrl+X……等等几乎所有软件都通用的一组快捷键,而着重介绍zde独有的快捷键,了解并 ...