独立线程实现消息循环的Delphi定时器类

本文介绍了一种在Delphi中实现独立线程消息循环的定时器类——TSfTimerThread,该类避免了TTimer在控制台程序中的限制,允许在无窗口线程中使用定时器,并能灵活调整间隔和回调函数,尽管其Enable属性的关闭功能有待完善。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Delphi的定时器类TTimer内部是创建不可见的窗口,调用SetTimer这个Win32 API 来实现的。TTimer要求使用它的线程实现了消息循环。所以,除非控制台程序中实现消息循环,否则TTimer在控制台程序中是无效的。不过为了使用方便,可以我们写一个线程类来实现消息循环,并且不必创建隐藏窗口便可以使用定时器。下面面的TSfTimerThread就是这样的类,它可以在不终止线程的情况下改变定时间隔和定时触发的函数。不过目前Enable属性是利用是否进行回调来实现的,也就是Enable设置为False时,定时器依然有效,并且线程会收到WM_TIMER消息,只是收到消息后不进行回调。由于关闭定时测试没有通过,所以暂时这样实现。

 

{ Timer Utility Library  , Copyright (c) Zhou Zuoji }      

unit SfTimerThread
interface
uses
    Classes
,
    SysUtils
,
    Windows
,
    SfException;
type
    TWin32TimerProc 
=  procedure( WndHandle :  THandle; uMsg :  UINT; idEvent :  UINT_PTR; dwTime :  DWORD ); stdcall;
    TSfTimerProc 
=  procedure(Param : Integer ;ATimerID :  Cardinal; dwTickCount :  Cardinal ) of  object ;
    TSfTimerThread 
=   class ( TThread )
    
private
        FTimerID
:  Cardinal;
        FTimerProc
:  TSfTimerProc;
        FInterval
:  Cardinal;
        FTimerProcSyncExec
:   Boolean ;
        FUpdateRequired
:   Boolean ;
        FKillRequired
:   Boolean ;
        FMessage
:  TMsg;
        FEnabled
:   Boolean ;
        FParam
:   Integer ;
        
function  CreateTimer :   Boolean ;
        procedure DestroyTimer;
        
function  AdjustTimerInterval( AInterval :  Cardinal ) :  Cardinal;
    
protected
        procedure SetInterval( 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值