微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 电源设计 > 一个高效的定时器分析及设计

一个高效的定时器分析及设计

时间:12-08 来源:互联网 点击:

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() %

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top