一个ACE 架构的 C++ Timer
.h
#ifndef _Timer_Task_
#define _Timer_Task_ #pragma once #include <ace/Task.h>
#include <ace/Singleton.h>
#include <ace/Null_Mutex.h>
//#include <ace/OS_NS_Thread.h> typedef int (*pfnTimerTriggerEvent)(void *pContext); class TimerTask : public ACE_Task_Base
{
friend class ACE_Singleton<TimerTask, ACE_Null_Mutex>;
public:
TimerTask(void);
~TimerTask(void); public:
virtual int svc (); public:
int Start(pfnTimerTriggerEvent pTriggerEvent, void* pContext = NULL);
int Stop();
/* Seconds */
int ResetTimer(int nElapsedInterval); public:
int m_nElapsedInterval; private:
bool m_bStop;
ACE_event_t m_hResetEvent; private:
pfnTimerTriggerEvent m_pTriggerEvent;
void *m_pContext;
};
typedef ACE_Singleton<TimerTask, ACE_Null_Mutex> TimerTaskSingleton;
#define TIMERTASK TimerTaskSingleton::instance() #endif //_Timer_Task_
.cpp
#include "TimerTask.h"
//#include <ace/Thread_Manager.h>
//#include <ace/Time_Value.h> TimerTask::TimerTask(void)
: m_bStop(true),
m_pContext(NULL),
m_pTriggerEvent(NULL),
m_nElapsedInterval()
{
}
TimerTask::~TimerTask(void)
{
Stop();
} int TimerTask::svc()
{
if (NULL == m_pTriggerEvent)
return -; ACE_Time_Value tTimeOut(m_nElapsedInterval);
while (!m_bStop)
{
int iRet = ACE_OS::event_timedwait(&m_hResetEvent, &tTimeOut, );
if (m_bStop)
break; if ( == iRet)
continue; if (ETIME == ACE_OS::last_error())
{
m_pTriggerEvent(m_pContext);
}
}
return ;
} int TimerTask::Start(pfnTimerTriggerEvent pTriggerEvent, void* pContext)
{
if (NULL == pTriggerEvent)
return -; m_pContext = pContext;
m_pTriggerEvent = pTriggerEvent; if (ACE_OS::event_init(&m_hResetEvent, , ) != )
return -; m_bStop = false;
if (activate(THR_NEW_LWP | THR_JOINABLE |THR_INHERIT_SCHED) != )
return -;
return ;
} int TimerTask::Stop()
{
if (!m_bStop)
{
m_bStop = true;
ACE_OS::event_signal(&m_hResetEvent);
wait();
ACE_OS::event_destroy(&m_hResetEvent);
}
return ;
} int TimerTask::ResetTimer(int nElapsedInterval)
{
m_nElapsedInterval = nElapsedInterval;
return ACE_OS::event_signal(&m_hResetEvent);
}
一个ACE 架构的 C++ Timer的更多相关文章
- 一个ACE 架构的 Socket Client
.h /************************************************************** * Filename: TcpClient.h * Copyrig ...
- .Net机试题——编写一个BS架构的多层表结构的信息管理模块
要求: 编写一个BS架构的多层表结构的信息管理模块,用户体验需要注意.包含错误处理,需要最终能完整的跑起来.页面可以不美化,但是整洁还是必须的.在不能完成详细功能需求的情况下优先保证基本功能. 1 ...
- 一个Android 架构师的成长之路
前言 总所周知,当下流行的编程语言有Java.PHP.C.C++.Python.Go等.其中,稳坐榜首的仍然是Java编程语言,且在以面向对象思想占主导的应用开发中,Java往往成为其代名词.Java ...
- Kubernetes实战 - 从零开始搭建微服务 1 - 使用kind构建一个单层架构Node/Express网络应用程序
使用kind构建一个单层架构Node/Express网络应用程序 Kubernetes实战-从零开始搭建微服务 1 前言 准备写一个Kubernetes实战系列教程,毕竟cnblogs作为国内最早的技 ...
- 【架构】生成全局唯一ID的3个思路,来自一个资深架构师的总结
标识(ID / Identifier)是无处不在的,生成标识的主体是人,那么它就是一个命名过程,如果是计算机,那么它就是一个生成过程.如何保证分布式系统下,并行生成标识的唯一与标识的命名空间有着密不可 ...
- 阿里Java架构师谈谈架构和如何成为一个Java架构师
架构的定义 我们来看看软件架构的一般定义: 程序和计算系统软件体系结构是指系统的一个或多个结构. 该结构包括软件的构建,构建的外部可见属性以及它们之间的相互关系. 该体系结构不是可操作的软件. 具体来 ...
- 很小的一个函数执行时间调试器Timer
对于函数的执行性能(这里主要考虑执行时间,所耗内存暂不考虑),这里写了一个简单的类Timer,用于量化函数执行所耗时间. 整体思路很简单,就是new Date()的时间差值.我仅仅了做了一层简单的封装 ...
- 一个App架构例子分析--UI层使用MVP模式;各层之间使用Otto实现通信
一.这个App整体的架构划分: 分为四大模块: 1.app模块 2.common模块 3.domain模块 4.model模块 app模块的依赖: dependencies { c ...
- 要成为一个 Java 架构师得学习哪些知识?
作者:zhuqz链接:https://www.zhihu.com/question/29031276/answer/54631312来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...
随机推荐
- Java实现 LeetCode 318 最大单词长度乘积
318. 最大单词长度乘积 给定一个字符串数组 words,找到 length(word[i]) * length(word[j]) 的最大值,并且这两个单词不含有公共字母.你可以认为每个单词只包含小 ...
- Java实现 蓝桥杯VIP 算法训练 方格取数
问题描述 设有NN的方格图(N<=10),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0. 某人从图的左上角的A 点(1,1)出发,可以向下行走,也可以向右走,直到到达右下角的B点 ...
- Java实现 LeetCode 306 累加数
306. 累加数 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 ...
- Java实现 LeetCode 201 数字范围按位与
201. 数字范围按位与 给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点). 示例 1: 输入 ...
- Java实现蓝桥杯七对数字
今有7对数字:两个1,两个2,两个3,-两个7,把它们排成一行. 要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字.如下就是一个符合要求的排列: 1712642 ...
- 倍增法求LCA代码加详细注释
#include <iostream> #include <vector> #include <algorithm> #define MAXN 100 //2^MA ...
- local 对象补充
昨日回顾 1 @app.before_first_request,再项目启动后接收到的第一个请求,会执行before_first_request,他再@app.before_request之前执行.他 ...
- layui导出表格的两种方法
一.不熟悉layui小白使用方法 1.引入如下js文件: 2.编写如下函数: 3.表格ID要与函数取值保持一致即可,再就是自定义一个按钮触发事件 二.引入插件使用方法 1.layui官网下载插件包: ...
- hadoop知识整理(2)之MapReduce
之前写的关于MR的文章的前半部分已丢. 所以下面重点从3个部分来谈MR: 1)Job任务执行过程,以及主要进程-ResourceManager和NodeManager作用: 2)shuffle过程: ...
- (七)MySQL常见的数据类型、约束和标识列
一.MySQL常见数据类型 1.数值型: ①整型:tinyint.smllint.mediumint.int/integer.bigint 图源:尚硅谷李玉婷 案例1:关键表格teacher,分别添加 ...