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_

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

438

被折叠的 条评论
为什么被折叠?



