C++后台服务如何高效实现多个定时器任务
大部分云端的后台服务,经常会使用到定时器功能来检测一些状态值的变化,且当定时器较多时,就需要设计统一的定时器管理模块来维护所有的定时器资源。然而要设计性能良好的定时器和管理模块,是需要一定的经验和技巧的,所以,姑且在此炫技一回,分享一下定时器模块设计的方法,主要从数据结构的角度来考虑。
采用自下而上的层次来设计,首先将每个定时器作为一个定时器节点的数据结构,结构体如下所示:
struct Node {
time_t start_time; //上一次触发的时间,用于比较是否到点
int timerId; //定时器id,唯一标识
int timeVal; //间隔多少秒执行一次
int count; //当前触发次数
int total; //总的触发次数
bool type; //是否无限循环
bool isUsed; //是否被使用了
Timer* timerObj; //执行定时任务的处理对象,其他使用到定时器的类需要以Timer作为基类
Node* next_node;
Node* prev_node;
}
定时器节点管理模块如下所示:
class Manager {
Node* nodes; //指向所有节点构成的数组的指针
int maxCount; //最大时间节点的数目
int idleCount; //空闲的时间节点数目
Node idleHead; //空闲节点的第一个节点,当申请创建新时间节点时,从这里取
Node usedHead; //当对所有定时器进行循环检测时,从这里开始
}
其对外提供的接口有:
- 设置并启动定时器
- 检测所有定时器任务是否间隔时间已经达到,达到后,则调用timerObj多态继承的基类函数来执行定时任务。
写在最后:为了使整个定时管理模块能够运行起来,应该设置一个线程来周期性的检测所有定时任务时间是否到达,一般情况会每秒检测一下,同时会与epoll网络模型结合起来用。
C++后台服务如何高效实现多个定时器任务的更多相关文章
- golang 后台服务设计精要
原文地址 守护进程 传统的后台服务一般作为守护进程(daemon)运行.linux 上创建 daemon 的步骤一般如下: 创建子进程,父进程退出: 调用系统调用 setsid() 脱离控制终端: 调 ...
- iPhone Anywehre虚拟定位提示“后台服务未启动,请重新安装应用后使用”的解决方法
问题描述: iPhone越狱了,之后在Cydia中安装Anywhere虚拟定位,但是打开app提示:后台服务未启动,请重新安装应用后使用. 程序无法正常使用... 解决方法: 打开Cydia-已安装, ...
- 带后台服务配置的tomcat使用
tomcat服务启动,将不需要手动启动startup.bat,避免cmd窗口的出现,因为隐藏到后台服务执行: 1,下载. 官网:http://tomcat.apache.org/download-70 ...
- Android 三级联动选择城市+后台服务加载数据库
技术渣,大家将就着看 首先我们需要一个xml数据保存到数据库,这里我从QQ下面找到一个loclist.xml文件 <CountryRegion Name="中国" Code= ...
- highchart访问一次后台服务返回多张图表数据
本文承接上一篇,我们制作动态图表的时候,往往需要的不止一张图表,如果每张图表都与服务接口做一次交互的话未免太过频繁,这无论对前后还是后台都是一种压力,本文介绍一种一次访问返回多组数据的方式来减少前台与 ...
- linux/windows下启用和停止VMware后台服务的脚本
linux/windows下启用和停止VMware后台服务的脚本 linux/windows下启用和停止VMware后台服务的脚本 linux平台 windows平台 本文由乌合之众 lym瞎编,欢迎 ...
- mongodb启动后台服务
将MongoDB部署在服务器机子上时mongodb的实例应为后台服务进行的方式运行,而非前台进程,否则远程会话一关闭mongodb也跟着关闭了.本文介绍mongodb后台服务进程开启和关闭的操作. 开 ...
- 【JavaService】部署Java jar为Windows后台服务
将Java jar文件部署为Windows后台服务有多种方法:Service Installer.Java service Wrapper.JavaService.exe等等.这里介绍下使用JavaS ...
- 答CsdnBlogger问-关于定时和后台服务问题
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 前段时间写了不少博客,在问答页面也陆续回答几十个问题,之后Csdn乙同学找到我,说要推荐我参加问答类 ...
随机推荐
- DropShadowEffect导致下拉框控件抖动
<!--<Border.Effect> <DropShadowEffect Direction="180" BlurRadius="1" ...
- VirtualBox-Debian7.2-share
1.在VirtualBox(用的版本是4.3.6)中,选择虚拟机->设置-> 共享文件夹, 2.添加一个主机上的文件夹readhat用来作为共享文件夹,选中固定分配和自动挂载, 结果:进入 ...
- 专题练习HDU题集 图论
[图论01]最短路 Start Time : 2018-01-02 12:45:00 End Time : 2018-01-23 12:45:00 Contest Status : Runnin ...
- Jconsole 测试.
Jconsole 测试. 1 下载并安装 d:\Program Files\Java\jdk1.8.0_111\ JDK自带,Windows下图形界面,监控分析Java程序 2 查看jmx进程号 [r ...
- Linux下Tomcat的启动和停止(包括杀死tomcat进程)
打开终端 cd /java/tomcat #执行 bin/startup.sh #启动tomcat bin/shutdown.sh #停止tomcat tail -f logs/catalina.ou ...
- 侯捷STL学习(二)--序列容器测试
第六节:容器之分类和各种测试(四) stack不提供iterator操作,破坏了容器的独特性,先进先出. 使用容器multiset(允许元素重复) 内部是红黑树,insert操作就保证了排好了序. 标 ...
- Python函数(八)-装饰器(一)
装饰器通过函数来定义,用来装饰函数 装饰器的结构为高阶函数和内嵌函数 装饰器不改变被装饰函数的源代码和运行方式 如何实现这个效果呢? # -*- coding:utf-8 -*- __author__ ...
- 2016.5.30实现透明Panel及控件置顶的方法
想放置一个透明Panel在某控件上端,实现效果是可透过此Panel看见下面控件,但鼠标点击却无任何反应. 1.新建置自定义Panel类 using System; using System.Colle ...
- suse 源的添加与删除,以及源地址
地址 一个是上海交大的,http://ftp.sjtu.edu.cn/opensuse/update/ 葡萄牙的: http://ftp.nux.ipb.pt/pub/dists/opensuse/u ...
- python 三元表达式、列表推导式、生成器表达式
一 三元表达式.列表推导式.生成器表达式 一 三元表达式 name=input('姓名>>: ') res='mm' if name == 'hahah' else 'NB' print( ...