C++ 实现的定时器

主要由两个类组成

1 cTimerMgr 管理所有的定时器对象 是一个单例对象

2 cTimerObj 每一个定时器对象都必须继承这个类

  重写

  virtual TimerResultEnum onTimer(int nTimeId)

  {

     return Timer_Exit;

  }

源代码如下:

1 cTimerMgr.h

 1 /*
 2  * cTimerObj.h
 3  *
 4  *  Created on: Jan 27, 2016
 5  *      Author: work
 6  */
 7
 8 #ifndef CTIMEROBJ_H_
 9 #define CTIMEROBJ_H_
10
11 //定时器类型
12 //enum TimerTypeEnum
13 //{
14 //    timeType_interval,        //间隔时间
15 //    timeType_point,            //指定时间点
16 //};
17
18 //定时器结果类型
19 enum TimerResultEnum
20 {
21     Timer_Exit,        //取消timer
22     Timer_Continue,    //继续timer
23 };
24
25 class cTimerObj
26 {
27 public:
28     cTimerObj();
29     virtual ~cTimerObj();
30
31 public:
32     int     AddTimer(int nInterval);
33     bool     DeleteTimer(int nTimerId);
34     bool    SetTimer(int nPointTime);//指定时间点触发
35
36     virtual TimerResultEnum onTimer(int nTimeId)
37     {
38         return Timer_Exit;
39     }
40
41 };
42
43 #endif /* CTIMEROBJ_H_ */

cTimerMgr.cpp

  1 /*
  2  * cTimerMgr.cpp
  3  *
  4  *  Created on: Jan 27, 2016
  5  *      Author: work
  6  */
  7
  8 #include "cTimerMgr.h"
  9 #include "time.h"
 10
 11 IM_INSTANCE(cTimerMgr)
 12 cTimerMgr::cTimerMgr()
 13 {
 14     // TODO Auto-generated constructor stub
 15
 16 }
 17
 18 cTimerMgr::~cTimerMgr()
 19 {
 20     // TODO Auto-generated destructor stub
 21 }
 22
 23 int cTimerMgr::AddTimer(int nInterval, cTimerObj* pObj)
 24 {
 25     if(nInterval <= 0 || pObj == 0)
 26     {
 27         return 0;
 28     }
 29
 30     long lNow = time(0);
 31     int nTimerID = GetTimerId();
 32     TimerNode* pTimeNode = new TimerNode();
 33     pTimeNode->_interval = nInterval;
 34     pTimeNode->_timer_id = nTimerID;
 35     pTimeNode->_pObj = pObj;
 36     pTimeNode->_time_dest = lNow + nInterval;
 37     m_queue.push(pTimeNode);
 38     m_mapNode[nTimerID] = pTimeNode;
 39     return nTimerID;
 40 }
 41
 42 bool cTimerMgr::DeleteTimer(int nTimerId)
 43 {
 44     itmapTimeNode it = m_mapNode.find(nTimerId);
 45     if(it == m_mapNode.end())
 46     {
 47         return false;
 48     }
 49     it->second->_cancelled = true;
 50     m_mapNode.erase(it);
 51     return true;
 52 }
 53
 54 int cTimerMgr::GetTimerId()
 55 {
 56     int static nid = 0;
 57     return nid++;
 58 }
 59
 60 void cTimerMgr::removeMap(int nTimerId)
 61 {
 62     itmapTimeNode it = m_mapNode.find(nTimerId);
 63     if(it == m_mapNode.end())
 64     {
 65         return ;
 66     }
 67     m_mapNode.erase(it);
 68 }
 69
 70 void cTimerMgr::process_timer()
 71 {
 72     long now_time = time(0);
 73
 74     while(!m_queue.empty())
 75     {
 76         TimerNode * t = m_queue.top();
 77         if(t->_time_dest <= now_time)
 78         {
 79             m_queue.pop();
 80             if(t->_cancelled == false)
 81             {
 82                 switch(t->_pObj->onTimer(t->_timer_id))
 83                 {
 84                 case Timer_Exit:
 85                     removeMap(t->_timer_id);
 86                     delete t;
 87                     break;
 88                 case Timer_Continue:
 89                     t->_time_dest = now_time + t->_interval;
 90                     m_queue.push(t);
 91                     break;
 92                 default:
 93                     break;
 94                 }
 95             }
 96             else
 97             {
 98                 removeMap(t->_timer_id);
 99                 delete t;
100             }
101         }
102         else
103         {
104             break;
105         }
106     }
107 }

2  cTimerObj.h

 1 /*
 2  * cTimerObj.h
 3  *
 4  *  Created on: Jan 27, 2016
 5  *      Author: work
 6  */
 7
 8 #ifndef CTIMEROBJ_H_
 9 #define CTIMEROBJ_H_
10
11 //定时器类型
12 //enum TimerTypeEnum
13 //{
14 //    timeType_interval,        //间隔时间
15 //    timeType_point,            //指定时间点
16 //};
17
18 //定时器结果类型
19 enum TimerResultEnum
20 {
21     Timer_Exit,        //取消timer
22     Timer_Continue,    //继续timer
23 };
24
25 class cTimerObj
26 {
27 public:
28     cTimerObj();
29     virtual ~cTimerObj();
30
31 public:
32     int     AddTimer(int nInterval);
33     bool     DeleteTimer(int nTimerId);
34     bool    SetTimer(int nPointTime);//指定时间点触发
35
36     virtual TimerResultEnum onTimer(int nTimeId)
37     {
38         return Timer_Exit;
39     }
40
41 };
42
43 #endif /* CTIMEROBJ_H_ */

cTimerObj.cpp

 1 /*
 2  * cTimerObj.cpp
 3  *
 4  *  Created on: Jan 27, 2016
 5  *      Author: work
 6  */
 7
 8 #include "cTimerObj.h"
 9 #include "cTimerMgr.h"
10
11 cTimerObj::cTimerObj()
12 {
13     // TODO Auto-generated constructor stub
14
15 }
16
17 cTimerObj::~cTimerObj()
18 {
19     // TODO Auto-generated destructor stub
20 }
21
22 int cTimerObj::AddTimer(int nInterval)
23 {
24     return cTimerMgr::Inst().AddTimer(nInterval, this);
25 }
26
27 bool cTimerObj::DeleteTimer(int nTimerId)
28 {
29     return cTimerMgr::Inst().DeleteTimer(nTimerId);
30 }

3 客户程序

使用例子:

CApple.h

 1 /*
 2  * cApple.h
 3  *
 4  *  Created on: Jan 28, 2016
 5  *      Author: work
 6  */
 7
 8 #ifndef CAPPLE_H_
 9 #define CAPPLE_H_
10 #include "cTimerObj.h"
11
12 class cApple : public cTimerObj
13 {
14 public:
15     cApple();
16     virtual ~cApple();
17
18 public:
19     virtual TimerResultEnum onTimer(int nTimeId);
20
21 private:
22     int m_id1;
23     int m_id2;
24
25     void onHandle1();
26     void onHandle2();
27 };
28
29 #endif /* CAPPLE_H_ */

CApple.cpp

 1 /*
 2  * cApple.cpp
 3  *
 4  *  Created on: Jan 28, 2016
 5  *      Author: work
 6  */
 7
 8 #include "cApple.h"
 9 #include "stdio.h"
10
11 cApple::cApple()
12 {
13     // TODO Auto-generated constructor stub
14     m_id1 = AddTimer(4);
15     m_id2 = AddTimer(10);
16 }
17
18 cApple::~cApple() {
19     // TODO Auto-generated destructor stub
20 }
21
22
23 TimerResultEnum cApple::onTimer(int nTimeId)
24 {
25     if(nTimeId == m_id1)
26     {
27         onHandle1();
28         return Timer_Continue;
29     }
30     else if(nTimeId == m_id2)
31     {
32         onHandle2();
33         return Timer_Exit;
34     }
35
36     return Timer_Exit;
37 }
38 void cApple::onHandle1()
39 {
40     printf("111111111111111111111111111111111\n");
41 }
42
43 void cApple::onHandle2()
44 {
45     printf("222222222222222222222222222222222\n");
46 }

4 main 函数 每帧循环调用

 1 //============================================================================
 2 // Name        : timeMgr.cpp
 3 // Author      : fangjunmin
 4 // Version     :
 5 // Copyright   : Your copyright notice
 6 // Description : Hello World in C++, Ansi-style
 7 //============================================================================
 8
 9 #include <iostream>
10 #include "cApple.h"
11 #include "cTimerMgr.h"
12
13 using namespace std;
14
15 int main()
16 {
17     cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
18     cApple apple;
19     while(1)
20     {
21         cTimerMgr::Inst().process_timer();
22     }
23     return 0;
24 }
时间: 2024-11-07 20:39:00

C++ 实现的定时器的相关文章

Android零基础入门第60节:日历视图CalendarView和定时器Chronometer

原文:Android零基础入门第60节:日历视图CalendarView和定时器Chronometer 上一期学习了AnalogClock.DigitalClock和TextClock时钟组件,本期继续来学习日历视图CalendarView和定时器Chronometer. 一.CalendarView 日历视图(CalendarView)可用于显示和选择日期,用户既可选择一个日期,也可通过触 摸来滚动日历.如果希望监控该组件的日期改变,则可调用CalendarView的 setOnDateCha

发送短信验证码按钮 定时器

static int i = 29; @property(nonatomic,strong) NSTimer *timmer;//定时器 - (void)sendNumber{ NSLog(@"发送验证码"); self.getTelephoneCodeBtn.enabled = NO; [self.getTelephoneCodeBtn setTitle:@"已发送" forState:UIControlStateDisabled]; [self.getTelep

《TCP/IP具体解释》读书笔记(22章)-TCP的坚持定时器

TCP通过让接收方指明希望从发送方接收的数据字节数(即窗体大小)来进行流量控制. 假设窗体大小为0会发生什么情况呢?这将有效阻止发送方传送数据,直到窗体变为非0为止. ACK的传输并不可靠,也就是说,TCP不正确ACK报文段进行确认,TCP仅仅确认那些包括有数据的ACK报文段. 1.坚持定时器 假设一个场景:假设一个确认丢失了,则两方就有可能由于等待对方而使连接终止,接收方等待接收数据(由于它已经向发送方通告了一个非0的窗体),而发送方在等待同意它继续发送数据的窗体更新.为防止这种死锁情况的发生

javascript-函数和定时器

1.函数自执行 JavaScript中不像C#中那样要求所有路径都有返回值,没有返回值就是undefined (function(){alert(1);}()); (function(){alert(1);})(); !function(){alert(1);}(); void function(){alert(2);}(); 2.可变参数 js函数无法像C#方法那样重载 下面的代码等于是对a函数重新定义 function a() { alert("无参函数"); } function

&lt;JavaScript&gt; 八. 定时器

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title></title> 5 <script type="text/javascript"> 6 /* 7 定时器 周期性执行JS代码 8 */ 9 10 // --------------------- 方法 ----------------------- 11 /* 12 1. setInterval(code, millisec

JavaScript定时器原理分析

.header { cursor: pointer } p { margin: 3px 6px } th { background: lightblue; width: 20% } table { text-align: center; margin-top: 20px; margin-left: 10px; margin-bottom: 20px } a { cursor: pointer; text-decoration: none; color: gray } a:hover { text

workman源代码阅读 - 使用信号处理器实现定时器

<?php /** * SIGALRM信号处理器注册成功后,在什么情况下进程会收到该信号呢? * * 在Linux系统下,每个进程都有惟一的一个定时器,该定时器提供了以秒为单位的定时功能.在定时器设置的超时时间到达后,调用alarm的进程将收到SIGALRM信号. */ /** * 启动信号处理器 */ \MySignalClazz::init(); /** * 信号处理器 * @author Administrator * */ class MySignalClazz { /** * Task

关于JS中的定时器!!!

定时器: 周期性定时器 一次性定时器 1. 周期性定时器: 让程序每隔一段时间间隔,反复执行一项任务 何时使用: 只要连续,有规律的持续播放的动画 如何使用: 3件事: 1. ***任务函数: 定时器每次执行的任务 function task(){...} 任务函数通常要自己考虑:*何时停止*定时器的临界值 2. 将任务函数放入定时器,定时执行: timer=setInterval(task,interval) 其中: interval 是间隔的毫秒数 timer往往是一个全局变量: 用来保存当

如何弹出一个窗口气泡(使用定时器向上移动)

原文链接:http://blog.csdn.net/tangaowen/article/details/5108980 如何弹出一个窗口气泡 最近在工作中遇到这样一个需求,就是需要将一个窗口从右下角任务栏下面缓缓的上升到任务栏的上面,现在有很多的软件都有这样的气泡,比如:搜狗输入法的词条更新窗口,还比如CSDN的广告窗口等等. 1.首先 将要弹出的窗口移动到任务栏(当前屏幕)以下 2.然后,获得任务栏(本质是个窗口)的高度,这样就可以知道窗口最终的位置了 3.然后,计算获得窗口最终停止的位置:计

JavaScript实现绑定DOM的定时器插件

问题 使用原生的setTimeout和setInterval仅仅能够实现, 定时执行事件处理函数, 在网页开发中, 往往会出现一种情况,定时器用于定时更新某个页面区域的数据, 往往在页面加载之后, 就启动这个定时器, 往后则间隔执行此定时器. 页面上定时刷新的区域可能会动态消失, 特别是在ajax被广泛使用的今天, 如果定时刷新的区域被删除了, 则定时器材也需要自动清除掉. 此二个接口,如果实现这种效果需要, 自己维护定时器句柄, 并且在处理定时器事件函数的时候, 首先判断 指定的刷新区域是否还