基于ACE中ACE_Event_Handler的定时器管理器实现

来源:互联网 发布:大数据培训内容 编辑:程序博客网 时间:2024/05/14 00:28

在C++项目开发中有许多用到定时器的地方,比如各个进程间定时发心跳数据,ftp服务定时扫描文件等等。由于定时器实现一般属于框架类的东西,工作中如果业务做的比较多的话容易忘记,这里记录一下基于ACE的定时器管理器的实现。
【定时器类】
1、由于是要被管理的,所以每个定时器都需要有一个定时器Id;
2、handle_timeout函数为定时器到点时候调用的函数;
3、设置定时器ID;
4、获取定时器ID;
5、多线程安全考虑,最好加把锁;
可以定义如下:

class CTimer : public ACE_Event_Handler{public:     CTimer(int uCID);    ~CTimer() {}    virtual int handle_timeout(const ACE_Time_Value &current_time, const void * = 0);    bool SetTimerId(long TimerId);    int GetTimerIds();private:    int mCID;    //加锁};

【定时器管理器】
属性
1、ACE_Thread_Manager 线程管理器。用主动对象
2、ACE_Reactor ACE框架定义的反应器。
3、map

class TimerMgr {public:    TimerMgr();    ~TimerMgr();    int AddTimer(int uCID, unsigned int intvals);    bool KillTimer(int uCID);    int ResetTimer(int uCID, unsigned int intvals);    bool KillTimers();    int Run();    void Stop();private:    static void SchelTimers(ACE_Reactor *reactor);    ACE_Reactor m_TimerMgr;    ACE_Thread_Manager m_Tgr;    map<int, CTimer *> mCTimers;    //加锁};

【实现注意点】
1、利用ACE框架Run()实现如下:

int TimerMgr::Run(){     m_TimerMgr.reset_reactor_event_loop();     if (m_Tgr.spawn((ACE_THR_FUNC)SchelTimers, &m_TimerMgr) == -1)     {         return -1;     }    return 0;}

2、停止所有计时器void Stop()如下:

void TimerMgr::Stop(){    m_TimerMgr.end_reactor_event_loop();    m_Tgr.wait(0);    return 0;}

3、主动对象线程函数SchelTimers实现如下:

void TimerMgr::SchelTimers(ACE_Reactor *pTimerMrg){    if (pTimerMrg == NULL)    {        return ;    }    pTimerMrg->owner(ACE_Thread::self());    while(1)    {        if (!pTimerMrg->event_loop_done())        {            pTimerMrg->handle_events();        }        else        {            break;        }    }}

【总结】
其他函数实现比较基础,关于ACE中框架后续再做研究。并对该实现进行优化。

原创粉丝点击