自己写的一个多进程的定时器类方便使用,放在bolg里
2017-04-24 21:19
225 查看
//cMyTimer.h
#pragma once
#include "string"
#include "list"
using namespace std;
struct stTimer
{
unsigned timeElapce;
//定时器间隔运行时间
unsigned timeCreate;
//定时器创建时间
unsigned timeLastRun;
//定时器上次执行时间
unsigned id;
//定时器ID号
int iParam;
//预留参数
string
strParam; //预留参数
bool bDel;
//是否已被删除
stTimer()
{
timeCreate = 0;
timeLastRun = 0;
id = -1;
iParam = 0;
bDel = false;
}
};
typedef list<stTimer> stTimerList;
typedef list<stTimer>::iterator itTimerList;
class cMyTimer
{
public:
cMyTimer();
virtual ~cMyTimer();
//添加定时器
void AddTimer(unsigned timerId, unsigned timeMs,int param = 0,
char* p=NULL);
//删除定时器
void DeleteTimer(int id);
//定时器处理
virtual int OnTimer(int id,int iParam,string str) = 0;
//检测定时器运行
bool TimerRun();
//清除所有定时器
void ClearTimer();
//定时检测删除定时器
void CheckDelTimer();
private:
stTimerList m_timerList;
//定时器列表
};
//cMyTimer.cpp
#include "stdafx.h"
#include "cMyTimer.h"
#include "windows.h"
#include "process.h"
cMyTimer::cMyTimer()
{
}
cMyTimer::~cMyTimer()
{
ClearTimer();
}
void cMyTimer::ClearTimer()
{
for (itTimerList it = m_timerList.begin();it != m_timerList.end();++it)
{
it->bDel = true;
}
}
void CheckTimerRun(void* p)
{
cMyTimer* pTimer = (cMyTimer*)p;
if (pTimer == NULL)
{
return;
}
while(1)
{
pTimer->CheckDelTimer();
//检测是否有定时器要运行
if(!pTimer->TimerRun())
{
_endthread();
}
Sleep(20);
}
}
//添加定时器
void cMyTimer::AddTimer(unsigned timerId,unsigned timeMs,int param,char* p)
{
if (timeMs == 0)
{
return;
}
stTimer stTimerTemp;
stTimerTemp.bDel = false;
stTimerTemp.id = timerId;
stTimerTemp.iParam = param;
if (p != NULL)
{
stTimerTemp.strParam = p;
}
unsigned timeNow = GetTickCount();
stTimerTemp.timeCreate = timeNow;
stTimerTemp.timeLastRun = timeNow;
stTimerTemp.timeElapce = timeMs;
m_timerList.push_back(stTimerTemp);
if (m_timerList.size() == 1)
{
//说明此时是第一个定时器
_beginthread(CheckTimerRun,0,this);
}
}
//删除定时器
void cMyTimer::DeleteTimer(int id)
{
for (itTimerList it = m_timerList.begin();it != m_timerList.end();++it)
{
if (it->id == id)
{
it->bDel = true;
return;
}
}
}
//定时器处理
//int cMyTimer::OnTimer(int id,int iParam,string str)
//{
// return 1;
//}
//定时检测删除定时器
void cMyTimer::CheckDelTimer()
{
for (itTimerList it = m_timerList.begin();it != m_timerList.end();)
{
if (it->bDel)
{
m_timerList.erase(it);
it = m_timerList.begin();
continue;
}
++it;
}
}
bool cMyTimer::TimerRun()
{
if (m_timerList.size() == 0)
{
return false;
}
unsigned timeNow = GetTickCount();
for (itTimerList it = m_timerList.begin();it != m_timerList.end();++it)
{
if (timeNow>=it->timeLastRun + it->timeElapce)
{
it->timeLastRun = timeNow;
if(OnTimer(it->id,it->iParam,it->strParam) == 0)
{
//删除定时器
it->bDel = true;
}
continue;
}
}
return true;
}
#pragma once
#include "string"
#include "list"
using namespace std;
struct stTimer
{
unsigned timeElapce;
//定时器间隔运行时间
unsigned timeCreate;
//定时器创建时间
unsigned timeLastRun;
//定时器上次执行时间
unsigned id;
//定时器ID号
int iParam;
//预留参数
string
strParam; //预留参数
bool bDel;
//是否已被删除
stTimer()
{
timeCreate = 0;
timeLastRun = 0;
id = -1;
iParam = 0;
bDel = false;
}
};
typedef list<stTimer> stTimerList;
typedef list<stTimer>::iterator itTimerList;
class cMyTimer
{
public:
cMyTimer();
virtual ~cMyTimer();
//添加定时器
void AddTimer(unsigned timerId, unsigned timeMs,int param = 0,
char* p=NULL);
//删除定时器
void DeleteTimer(int id);
//定时器处理
virtual int OnTimer(int id,int iParam,string str) = 0;
//检测定时器运行
bool TimerRun();
//清除所有定时器
void ClearTimer();
//定时检测删除定时器
void CheckDelTimer();
private:
stTimerList m_timerList;
//定时器列表
};
//cMyTimer.cpp
#include "stdafx.h"
#include "cMyTimer.h"
#include "windows.h"
#include "process.h"
cMyTimer::cMyTimer()
{
}
cMyTimer::~cMyTimer()
{
ClearTimer();
}
void cMyTimer::ClearTimer()
{
for (itTimerList it = m_timerList.begin();it != m_timerList.end();++it)
{
it->bDel = true;
}
}
void CheckTimerRun(void* p)
{
cMyTimer* pTimer = (cMyTimer*)p;
if (pTimer == NULL)
{
return;
}
while(1)
{
pTimer->CheckDelTimer();
//检测是否有定时器要运行
if(!pTimer->TimerRun())
{
_endthread();
}
Sleep(20);
}
}
//添加定时器
void cMyTimer::AddTimer(unsigned timerId,unsigned timeMs,int param,char* p)
{
if (timeMs == 0)
{
return;
}
stTimer stTimerTemp;
stTimerTemp.bDel = false;
stTimerTemp.id = timerId;
stTimerTemp.iParam = param;
if (p != NULL)
{
stTimerTemp.strParam = p;
}
unsigned timeNow = GetTickCount();
stTimerTemp.timeCreate = timeNow;
stTimerTemp.timeLastRun = timeNow;
stTimerTemp.timeElapce = timeMs;
m_timerList.push_back(stTimerTemp);
if (m_timerList.size() == 1)
{
//说明此时是第一个定时器
_beginthread(CheckTimerRun,0,this);
}
}
//删除定时器
void cMyTimer::DeleteTimer(int id)
{
for (itTimerList it = m_timerList.begin();it != m_timerList.end();++it)
{
if (it->id == id)
{
it->bDel = true;
return;
}
}
}
//定时器处理
//int cMyTimer::OnTimer(int id,int iParam,string str)
//{
// return 1;
//}
//定时检测删除定时器
void cMyTimer::CheckDelTimer()
{
for (itTimerList it = m_timerList.begin();it != m_timerList.end();)
{
if (it->bDel)
{
m_timerList.erase(it);
it = m_timerList.begin();
continue;
}
++it;
}
}
bool cMyTimer::TimerRun()
{
if (m_timerList.size() == 0)
{
return false;
}
unsigned timeNow = GetTickCount();
for (itTimerList it = m_timerList.begin();it != m_timerList.end();++it)
{
if (timeNow>=it->timeLastRun + it->timeElapce)
{
it->timeLastRun = timeNow;
if(OnTimer(it->id,it->iParam,it->strParam) == 0)
{
//删除定时器
it->bDel = true;
}
continue;
}
}
return true;
}
相关文章推荐
- 用JAD反编译修改NSG2以方便自己使用 转载
- 对各大门户网站的rss源的频道进行分类,集合。使用excel制作,方便按自己需求排序
- Linux常用命令,学的时候自己记的常用的保存下来方便以后使用 o(∩_∩)o 哈哈
- 公共免费开发接口地址 ---自己整理方便使用
- JS +XML +Jquery 实现三级联动菜单,自己封装的一个对象方便使用
- 数据库连接字符串,放在这里方便自己查找
- R语言-data.table包使用(方便自己使用参考)
- 使用SHChangeNotify让进程立即删除自己
- 使用SetPriorityClass让进程退出之后删除自己
- nmap使用方法--方便自己查
- 自己的无线网卡使用--方便以后自己查看
- MFC 对于使用自己的线进行启动其他进程的虚拟地址映射问题
- java 生成EXCEL 解决中文乱码问题(只供自己后面寻找方便)【转载悠悠的BOLG】
- (转)使用pth文件,让python方便的import自己写的模块
- C# 日期格式化(从别人处收藏,记下,方便自己使用)
- 为了方便维护,以后无论如何,数据库操作一定使用封装的强类型,或者自己封装的数据操作类。后记,使用分布式查询解决多个数据库之间的查询操作。
- C++拷贝构造函数详解(转载---原作者写的很好,不过还是放在自己这里查阅起来方便。)
- 用百度地图API打造方便自己使用的手机地图
- mysql 卖家数据 查询模板 放在博客里 方便使用
- easyui.utils.js 自己封装的 使用easyui过程中方便操作和取值(一)