我是靠谱客的博主 纯情睫毛,最近开发中收集的这篇文章主要介绍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 进阶基础技能说明

转载于:https://www.cnblogs.com/lackey/p/5411389.html

最后

以上就是纯情睫毛为你收集整理的Delphi 线程Timer (TThreadTimer)的全部内容,希望文章能够帮你解决Delphi 线程Timer (TThreadTimer)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部