C++Builder 动态生成定时器,创建定时器管理类

定时器是做客户端时常用的一类控件,只需要设置定时时间,开启定时器,然后创建定时事件响应函数,就能定时执行特定的功能,用起来很方便。当时当工程比较大,定时器比较多时,界面看起来就会比较混乱,当定时器名字起的不够直观时,管理起来比较困难。因此,我打算建立一个定时器管理类,对所有定时器统一管理。动态创建一个定时器实例的方法比较简单:

TTimer *tmr= new TTimer(this);(注意new时带参数)

但是,怎么创建事件相应函数呢,通过控件我们可以直接双击控件,直接填写定时功能代码就可以了,但是动态创建不能这样做。我首先想到的是,可不可以通过一个判断条件,执行事件响应函数,在这个过程中我发现了OnTimer属性,通过看它的定义,我发现这个属性是可读写的,类型是函数指针类型TNotifyEvent,那么是不是可以自定义一个TNotifyEvent类型函数,然后赋值给OnTimer作为定时器事件响应函数呢?经过尝试发现是可以的:

.h文件

#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <boost/shared_ptr.hpp>
using namespace boost;
//---------------------------------------------------------------------------
class TTimerManage : public TForm
{
__published:
private:
shared_ptr<TTimer> tmrUpDateDB;
void __fastcall OnTmrUpDateDB(TObject *Sender);
public:
__fastcall TTimerManage(TComponent* Owner);
void __fastcall TmrUpDateDB(double time, bool repeat);
};
//---------------------------------------------------------------------------
extern PACKAGE TTimerManage *TimerManage;
extern shared_ptr<TTimerManage> g_timerupdate;

.cpp文件

shared_ptr<TTimerManage> g_timerupdate(new TTimerManage(NULL));
TTimerManage *TimerManage;
__fastcall TTimerManage::TTimerManage(TComponent* Owner)
: TForm(Owner)
{
tmrUpDateDB.reset(new TTimer(this));
}
//---------------------------------------------------------------------------
void __fastcall TTimerManage::OnTmrUpDateDB(TObject *Sender)
{

tmrUpDateDB->Enabled = false; //——————————————1
ShowMessage("aaaaa");
}
void __fastcall TTimerManage::TmrUpDateDB(double time, bool repeat)
{
tmrUpDateDB->Interval = time;
tmrUpDateDB->OnTimer = OnTmrUpDateDB;
}

需要使用的定时器都在该单元中定义好,在外部使用时只要g_timerupdate->TmrUpDateDB(2000,false);就可以使用,其中第二个参数可以用于一些条件的判断,如是否循环执行。在实现过程中发现,当需要定时器事件只执行一次时,需要在showmessage前,关闭定时器,如果在之后关闭定时器,定时事件不执行。智能指针的声明和定义和普通变量同样有作用范围如果在一个函数内声明,作用范围就是这个函数,函数执行完释放指针。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值