您当前的位置:五五电子网电子知识单元电路时钟-定时电路一个高效的定时器分析及设计 正文
一个高效的定时器分析及设计

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

点击数:7659 次   录入时间:03-04 11:43:15   整理:http://www.55dianzi.com   时钟-定时电路
    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->etime = GetCurrSystemTime() + (rand() % 1000 ) * 6;

    42 tim->pFun =&test;

    43 tim->eType =(eTimerType)( i%3 + 10 );

    44

    45 mytimer.add_timer( tim );

    46 }

    47

    48 for ( ;; )

    49 {

    50 if ( (Sum1 + Sum2 + Sum3) == n )

    51 break;

    52

    53 /**//// 运行所有的定时器

    54 mytimer.Expires( GetCurrSystemTime() );

    55 }

    56

    57 std::cout << " sum1 = " << Sum1

    58 << " sum2 = " << Sum2

    59 << " sum3 = " << Sum3

    60 << " sum = " << Sum ;

    61 return 0;

    62}



上一页  [1] [2] 


本文关键字:定时器  时钟-定时电路单元电路 - 时钟-定时电路

《一个高效的定时器分析及设计》相关文章>>>