您的位置:首页 > 编程语言 > C语言/C++

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

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

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前,关闭定时器,如果在之后关闭定时器,定时事件不执行。智能指针的声明和定义和普通变量同样有作用范围如果在一个函数内声明,作用范围就是这个函数,函数执行完释放指针。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息