高性能秒级定时器实现源码

本文介绍了一种使用双时间轮数组交换方式实现的秒级定时器,通过C++类进行封装,并提供了API函数供开发人员使用。该定时器支持周期性和一次性定时任务,详细展示了其内部结构和工作原理。

1、本文展示秒级定时器的源码,源码是封装成C++类,然后再次封装成API函数的方式。

     用户开发手册地址:https://blog.csdn.net/freeland008/article/details/107508749

 

2、TimerVM.h和TimerVM.cpp是用c++类的方式实现了秒级时钟的封装,TimerMng.h、TimerMng.cpp实现了二次封装,更方便开发人员直接使用。

3、总体实现思路是使用双时间轮数组交换的方式。

 

4、TimerVM.h

#ifndef TIMERVM_H
#define TIMERVM_H

#include <time.h>

typedef void* HANDLE;

typedef struct _TIMERITEM
{	
	unsigned int dwTimes;	
	unsigned int dwTimeOut;
	time_t dtExpire;
	void* fp;
	void* pPara;			
	void* pPosArray;

	_TIMERITEM* pPrev;
	_TIMERITEM* pNext;
}TIMERITEM;
typedef TIMERITEM* LPTIMERITEM;

typedef struct _TIMERARRAY
{
	time_t dtStart;
	HANDLE* hArray;
	_TIMERARRAY()
	{
		dtStart = 0;
		hArray = NULL;
	}
}TIMERARRAY;
typedef TIMERARRAY* LPTIMERARRAY;

class CTimerMng
{ 
private:
	TIMERARRAY m_pTimerArrayA;
	TIMERARRAY m_pTimerArrayB;
	time_t m_dtLastCheck;
	int m_nArraySize;
public:
	LPTIMERARRAY m_pArrayOld;
	LPTIMERARRAY m_pArrayNew;
private:
	size_t m_nCount;	
	int m_nTimerOutCount;
	int m_nSetTimerCount;
	int m_nResetCycleTimerCount;
	int m_nResetOverTimerCount;
public:	
	LPTIMERITEM m_pResetList;
	LPTIMERITEM m_pOverList;
public:
	CTimerMng();
	~CTimerMng();
public:
	int Init(int nArraySize, time_t dtNow);
	int Destroy();
	LPTIMERITEM SetTimer(time_t dtNow, unsigned int dwTimeOut, unsigned int dwTimes, void* fp, void* pPara);	
	void ResetTimerCycle(LPTIMERITEM pItem);		
	void ResetTimerOver(LPTIMERITEM pItem);	
	void KillTimer(LPTIMERITEM pItem);
	void CheckTimeOut(time_t dtNow);
	void OnProcTimeOut(LPTIMERITEM pItem, time_t dtNow);		
	size_t GetCount(){return m_nCount;};
};

#endif

 

5、TimerVM.cpp

 

#include <stdio.h>
#include <stdlib.h>
#include "TimerVM.h"
#include "TimerMng.h"

CTimerMng :: CTimerMng()
{
	m_nCount = 0;		

	m_nTimerOutCount = 0;
	m_nSetTimerCount = 0;
	m_nResetCycleTimerCount = 0;
	 m_nResetOverTimerCount = 0;

	m_dtLastCheck = 0;
	m_pResetList = NULL;
	m_pOverList = NULL;

	m_pTimerArrayA.hArray = NULL;
	m_pTimerArrayB.hArray = NULL;
}

CTimerMng :: ~CTimerMng()
{
	Destroy();
}

int CTimerMng :: Init(int nArraySize, time_t dtNow)
{
	m_nArraySize = nArraySize;	

	m_pTimerArrayA.hArray = new HANDLE[m_nArraySize];
	int i;
	for (i = 0; i < m_nArraySize; i++)
	{
		m_pTimerArrayA.hArray[i] = NULL;
	}

	m_pTimerArrayB.hArray = new HANDLE[m_nArraySize];
	for (i = 0; i < m_nArraySize; i++)
	{
		m_pTimerArrayB.hArray[i] = NULL;
	}

	m_pArrayOld = &m_pTimerArrayA;
	m_pArrayNew = &m_pTimerArrayB;

	m_pArrayOld->dtStart = dtNow;
	m_pArrayNew->dtStart = m_pArrayOld->dtStart + m_nArraySize;

	m_dtLastCheck = dtNow;
	//////////////////////////////////////////////////////////////////////////		

	return 0;
}
/*
void CTimerMng :: Align(time_t dtNow)
{
	m_pArrayOld->dtStart = dtNow;
	m_pArrayNew->dtStart = m_pArrayOld->dtStart + m_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值