基于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 ¤t_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中框架后续再做研究。并对该实现进行优化。
阅读全文
0 0
- 基于ACE中ACE_Event_Handler的定时器管理器实现
- 基于ACE的定时器队列实现
- ACE - ACE_Event_Handler ACE_Reactor
- ACE定时器代码实现
- ACE学习(三)ACE_Event与ACE_Event_Handler
- ACE中的定时器实现原理
- ACE_Event_Handler
- ACE_Event_Handler
- 基于Android中实现定时器的3种解决方法
- 基于Android中实现定时器的3种解决方法
- 基于Android中实现定时器的3种解决方法
- 基于Android中实现定时器的3种解决方法
- 基于ACE reactor_echo_server实现
- 尽量使用ID取消ACE_Event_Handler定时器
- 基于Boost.MultiIndex实现的Session管理器
- ACE中线程的实现原理
- ACE中线程的实现原理
- 基于委托机制的定时器的实现
- c++作业5
- php 关于abstract和interface
- 宿主机无线上网,vmware unbutu12.04桥接模式,ping通,可上网
- 正确使用日志的10个技巧
- C++作业六
- 基于ACE中ACE_Event_Handler的定时器管理器实现
- 使用json数据实现简单的三级联动
- jstl自定义函数
- Hi,我们再来聊一聊Java的单例吧
- 基于图的深度优先遍历(DFS)与广度优先遍历(BFS)
- 整数对HDU
- c++动态链表的操作步骤
- Euler Project : Problem 22
- trie 前缀树