一个高效的定时器分析及设计
2 eTimer = 0,
13 eTimer2 ,
14 eTimer3
15};
16
17/**////
18/// 定时器结点,tlist表示结点的指针,expires循环周期时间
19/// etime 触发周期时间,pFun触发函数.
20///
21struct timernode
22{
23 ListNode tlist;
24 ulong expires;
25 ulong etime;
26 void *pFun;
27 eTimerType eType;
28};
3) 轮子类
1/**////
2/// 一个轮子,一个循环队列
3///
4///
5class CLinkList
6{
7
8public:
9
10 CLinkList(void);
11
12 CLinkList( int size );
13
14 ~CLinkList(void);
15
16 /**////
17 /// 初始化
18 ///
19 void init();
20
21 /**////
22 /// 让指针指向自己
23 ///
24 void init_list_self( int index);
25
26 /**////
27 /// 把news插入到prev,next之间
28 ///
29 void insert_listnode(ListNode *news , ListNode* prev , ListNode* next);
30
31 /**////
32 /// 插入到链表头
33 ///
34 void insert_head( ListNode* news , ListNode* head );
35
36 /**////
37 /// 插入到链表尾
38 ///
39 void insert_tail( ListNode* news , ListNode* head );
40
41 /**////
42 /// 删除节点
43 ///
44 void list_del( ListNode* list);
45
46 /**////
47 /// 得到改轮子转到第几个插槽
48 ///
49 int GetIndex( ) const { return m_index ;}
50
51 /**////
52 /// 更新轮子的插槽
53 ///
54 void SetIndex(int idx) { m_index = idx ;}
55
56 /**////
57 /// 得到轮子插槽的指针
58 ///
59 ListNode* GetNode(int index) const;
60
61private:
62 /**////
63 /// 轮子的插槽数组
64 ///
65 ListNode *m_List;
66
67 /**////
68 /// 轮子当前转到的索引
69 ///
70 int m_index;
71
72 /**////
73 /// 轮子大小
74 ///
75 int m_Size;
76
77};4)定时器管理类
定时器管理类
1/**////
2/// 定时器管理类,管理定时器的五个轮子
3///
4class CTimer
5{
6public:
7 /**////
8 /// 构造函数如下
9 ///
10 CTimer(void);
11
12 CTimer( int second);
13
14 ~CTimer(void);
15
16public:
17 /**////
18 /// 初始化定时器管理类
19 ///
20 void Init(int Second = 0);
21
22 /**////
23 /// 增加一个定时器
24 ///
25 void add_timer(timernode *times );
26
27 /**////
28 /// 检测定时器是否存在
29 ///
30 /// @return 如果存在返回true,否则为false
31 ///
32 bool check_timer(timernode* times);
33
34 /**////
35 /// 删除定时器
36 ///
37 /// @return 如果删除成功返回true,否则为false
38 ///
39 bool delete_timer(CLinkList* list, timernode *times);
40
41 /**////
42 /// 重新初始化一个定时器
43 ///
44 void init_timer(timernode* timers);
45
46 /**////
47 /// 定时器的迁移,也即将一个定时器从它原来所处的定时器向量迁移到另一个定时器向量中。
48 ///
49 void cascade_timer(CLinkList* timers);
50
51 /**////
52 /// 执行当前已经到期的定时器,所有小于jeffies的定时器
53 ///
54 void Expires( ulong jeffies);
55
56 /**////
57 /// 重新初始化一个定时器
58 ///
59 void Cancel(timernode* timers);
60
61 /**////
62 /// 重新计算一个定时器
63 ///
64 void Mod_timer(timernode* timers);
65
66private:
67 /**//// 5个轮子
68 CLinkList* m_tv1;
69 CLinkList* m_tv2;
70 CLinkList* m_tv3;
71 CLinkList* m_tv4;
72 CLinkList* m_tv5;
73 CLinkList** g_vecs;
74
75 /**//// 定时器全局tick
76 ulong m_jeffies;
77 /**//// 上次运行时间
78 ulong m_Lasttime;
79 /**//// 精确到毫秒
80 ulong m_mSecond;
81};
82
四: 测试
通过本文的介绍可以理解次定时器的的查找,删除,插入都是O(1)的复杂度。
/**//// 游戏事件基类
class CGameEvent
{
public:
virtual long TimeOut( eTimerType type) = 0;
};
测试例子:
1long Sum1= 0 ;
2long Sum2= 0 ;
3long Sum3= 0 ;
4long Sum = 0;
5
6class CTimertest : public CGameEvent
7{
8public:
9 long TimeOut( eTimerType type)
10 {
11 switch ( type)
12 {
13 case eTimer1:
14 std::cout <"Sum1 = "< Sum1 ++ < std::endl;
15 break;
16 case eTimer2:
17 std::cout <"Sum2 = "< Sum2 ++ < std::endl;
18 break;
19 case eTimer3:
20 std::cout <"Sum3 = "< Sum3 ++ < std::endl;
21 break;
22 default:
23 std::cout <"Sum = "< Sum ++ < std::endl;
24 break;
25 }
26 return 0;
27 }
28};
29
30int _tmain(int argc, _TCHAR* argv[])
31{
32 CTimer mytimer( 40 );
33
34 long n;
35 std::cin >> n;
36 CTimerTest test;
37 for ( int i = 0 ; i < n ; i++ )
38 {
39 timernode* tim = new timernode ;
40 tim->expires = 0;
41 tim->41 tim->etime = GetCurrSystemTime() + (rand() %
定时器分 相关文章:
- 电源设计小贴士 1:为您的电源选择正确的工作频率(12-25)
- 用于电压或电流调节的新调节器架构(07-19)
- 超低静态电流电源管理IC延长便携应用工作时间(04-14)
- 电源设计小贴士 2:驾驭噪声电源(01-01)
- 负载点降压稳压器及其稳定性检查方法(07-19)
- 电源设计小贴士 3:阻尼输入滤波器(第一部分)(01-16)