定时器代码

/*************************************************************************** 文件:HHTimer.c 作者:谭宜平 日期:2008-09-22 版本:1.0 描述:封装系统对定时器的操作 其他: ****************************************************************************/ #include "HHHeader.h" #define MAX_FILENAME_LENGTH 15 /* 最大的文件名长度 */ #define MAX_TIMER_NUM 256 /* 最大的定时器个数 */ #define DEFAULT_TIMER_RESOLUTION 1 /* ms */ /************************************************************************** 类型:结构体名称:TimerInfoDef 作用:定时器的相关信息 ***************************************************************************/ typedef struct tagTimerInfo { HhBool blIsUsed; /* 是否正在使用 */ pfTimerCBDef pfTimerCB; /* 定时器触发时的回调函数 */ HhBool blIsPeriodic; /* 是否周期性定时器 */ HhVoid *pAppContext; /* 应用程序上下文 */ HhInt iCounterLen; /* 定时器触发周期,ms */ HhInt iCounter; /* 定时器触发剩余时间 */ HhInt iTimerID; /* 定时器序号 */ HhChar szFile[MAX_FILENAME_LENGTH]; /* 文件名 */ HhInt iLineNo; /* 行号 */ }TimerInfoDef, *LPTimerInfoDef; /************************************************************************** 类型:全局变量名称:g_TimerTable 作用:定时器资源 ***************************************************************************/ static TimerInfoDef g_TimerTable[MAX_TIMER_NUM] = {0}; /************************************************************************** 类型:全局变量名称: 作用:10毫秒定时器 ***************************************************************************/ static HhULong g_ul10MSTimerID = 0; static HhInt g_iResolution = 0; /************************************************************************** 类型:全局变量名称:g_TableLock 作用:锁 ***************************************************************************/ static HhLockDef g_TableLock; /************************************************************************** 原型:LPTimerInfoDef AllocIdleTimer() 输入: 无输出: 无返回: 成功返回定时器资源,失败返回NULL 作用: 申请定时器资源 ***************************************************************************/ static LPTimerInfoDef AllocIdleTimer() { /* 从上次分配处往后分配 */ static HhInt s_iNextPos = 0; LPTimerInfoDef pTimerInfo; HhInt iCount = 0; /* 查找空闲的空间 */ while (HH_TRUE == g_TimerTable[s_iNextPos].blIsUsed) { s_iNextPos++; if (s_iNextPos >= MAX_TIMER_NUM) { s_iNextPos = 0; } iCount++; if (iCount >= MAX_TIMER_NUM) { break; } } if (iCount >= MAX_TIMER_NUM) { return NULL; } pTimerInfo = &(g_TimerTable[s_iNextPos]); pTimerInfo->blIsUsed = HH_TRUE; pTimerInfo->iTimerID = s_iNextPos + 1; s_iNextPos++; if (s_iNextPos >= MAX_TIMER_NUM) { s_iNextPos = 0; } return pTimerInfo; } /************************************************************************** 原型:HhInt FreeTimer(IN HhInt iTimerID) 输入: iTimerID : 定时器编号(HhTimerStart生成) 输出: 无返回: 成功返回HH_SUCCESS,失败返回HH_FAIL 作用: 释放定时器资源 ***************************************************************************/ static HhInt FreeTimer(IN HhInt iTimerID) { if (HH_FALSE == g_TimerTable[iTimerID - 1].blIsUsed) { ldOutput(EN_ET_DEBUG, "[%s:%d]FreeTimer():输入的Timer没被使用, %s : %d", __FILE__, __LINE__, "TimerID", iTimerID); return HH_FAIL; } memset(&(g_TimerTable[iTimerID - 1]), 0, sizeof(TimerInfoDef)); return HH_SUCCESS; } /************************************************************************** 原型: void CALLBACK On10MSTimer(UINT gwTimerID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2) 输入: UINT gwTimerID : 定时器ID UINT msg : 消息 DWORD dwUser : DWORD dw1 : 参数1 DWORD dw2 : 参数2 输出: 无返回: 0 成功,其他值失败作用: 10毫秒定时器回调函数 ***************************************************************************/ static void CALLBACK On10MSTimer(UINT gwTimerID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2) { HhInt i; LPTimerInfoDef pTimer; HhLockGet(&g_TableLock); for (i = 0; i < MAX_TIMER_NUM; i++) { if (g_TimerTable[i].blIsUsed) { pTimer = &(g_TimerTable[i]); pTimer->iCounter--; if (pTimer->iCounter <= 0) { if (NULL != pTimer->pfTimerCB) { /* 定时器到时的回调函数 */ (pTimer->pfTimerCB)(pTimer->iTimerID, (HhULong)pTimer->pAppContext); } /* 周期性定时器 */ if (pTimer->blIsPeriodic) { pTimer->iCounter = pTimer->iCounterLen; } else { FreeTimer(pTimer->iTimerID); } } } } HhLockRelease(&g_TableLock); return; } /************************************************************************** 原型:HhInt Start10MStimer() 输入: 无输出: 无返回: 0 成功,其他值失败作用: 启动10毫秒定时器 ***************************************************************************/ static HhInt Start10MStimer() { TIMECAPS tc; LARGE_INTEGER i64Freq = { 0 }; if (g_ul10MSTimerID != 0) { ldOutput(EN_ET_DEBUG, "[%s:%d]重复创建定时器!", __FILE__, __LINE__); return HH_FAIL; } if (timeGetDevCaps(&tc, sizeof(TIMECAPS)) != TIMERR_NOERROR) { ldOutput(EN_ET_DEBUG, "[%s:%d]获取定时器能力失败!", __FILE__, __LINE__); return HH_FAIL; } QueryPerformanceFrequency(&i64Freq); g_iResolution = __min(tc.wPeriodMax, __max(tc.wPeriodMin, DEFAULT_TIMER_RESOLUTION)); timeBeginPeriod(g_iResolution); g_ul10MSTimerID = timeSetEvent (10, /* delay */ g_iResolution, On10MSTimer, /* callback function */ (DWORD)NULL, /* user data */ TIME_PERIODIC); /* single timer event */ if (g_ul10MSTimerID == 0) { ldOutput(EN_ET_DEBUG, "[%s:%d]创建多媒体定时器失败", __FILE__, __LINE__); return HH_FAIL; } return HH_SUCCESS; } /************************************************************************** 原型:HhInt Stop10MSTimer() 输入: 无输出: 无返回: 0 成功,其他值失败作用: 停止10毫秒定时器 ***************************************************************************/ static HhInt Stop10MSTimer() { if (g_iResolution != 0) { timeEndPeriod(g_iResolution); g_iResolution = 0; } if (0 != g_ul10MSTimerID) { timeKillEvent(g_ul10MSTimerID); g_ul10MSTimerID = 0; } return HH_SUCCESS; } /************************************************************************** 原型:HhInt HhTimerStart(IN pfTimerCBDef pfTimerCB, IN HhULong ulTimerIndex, IN HhBool blIsPeriodic, IN HhVoid *pAppContext) 输入: pfTimerCBDef pfTimerCB : 定时器回调函数 ulTimerLength : 定时器时长,以ms为单位 blIsPeriodic : 是否周期性 pAppContext : 应用程序上下文(用于传递应用层信息,会附在定时器消息中) 输出: 无返回: <0 : 失败 >=0 : 成功,表示定时器编号(系统自动生成,用于STOP及区分序号相同的不同定时器) 作用: 启动定时器 ***************************************************************************/ HhInt HhTimerStartEx(IN pfTimerCBDef pfTimerCB, IN HhULong ulTimerLength, IN HhBool blIsPeriodic, IN HhVoid *pAppContext, IN HhChar* pszFile, IN HhInt iLineNo) { LPTimerInfoDef pTimerInfo = NULL; HhInt iLength, iStart; CHECK_PTR(pfTimerCB, HH_FAIL, "HHOS->HhTimerStartEx():NULL == pfTimerCB"); HhLockGet(&g_TableLock); pTimerInfo = AllocIdleTimer(); if (NULL == pTimerInfo) { HhLockRelease(&g_TableLock); return HH_FAIL; } pTimerInfo->blIsPeriodic = blIsPeriodic; pTimerInfo->iLineNo = iLineNo; pTimerInfo->pAppContext = pAppContext; pTimerInfo->pfTimerCB = pfTimerCB; pTimerInfo->iCounterLen = ulTimerLength / 10; pTimerInfo->iCounter = pTimerInfo->iCounterLen; iLength = strlen(pszFile); iStart = iLength - MIN(iLength, MAX_FILENAME_LENGTH); memcpy(pTimerInfo->szFile, pszFile + iStart, MAX_FILENAME_LENGTH); ldOutput(EN_ET_DEBUG, "[%s:%d]HhTimerStart();%d, File: %s, line: %d/n", / __FILE__, __LINE__, pTimerInfo->iTimerID, pszFile, iLineNo); HhLockRelease(&g_TableLock); return pTimerInfo->iTimerID; } /************************************************************************** 原型:HhInt HhTimerStop(IN HhInt iTimerID) 输入: iTimerID : 定时器编号(HhTimerStart生成) 返回: 0 成功,其他值失败作用: 停止指定定时器 ***************************************************************************/ HhInt HhTimerStopEx(IN HhInt iTimerID, IN HhChar* pszFile, IN HhInt iLineNo) { if ((iTimerID < 0) || (iTimerID > MAX_TIMER_NUM)) { ldOutput(EN_ET_DEBUG, "[%s:%d]HHOS->HhTimerStopEx();输入TimerID非法%d, File: %s, line: %d/n", / __FILE__, __LINE__, iTimerID, pszFile, iLineNo); return HH_FAIL; } HhLockGet(&g_TableLock); FreeTimer(iTimerID); HhLockRelease(&g_TableLock); ldOutput(EN_ET_DEBUG, "[%s:%d]HHOS->HhTimerStop();%d, File: %s, line: %d/n", / __FILE__, __LINE__, iTimerID, pszFile, iLineNo); return HH_FAIL; } /************************************************************************** 原型:HhInt HhTimerReset(IN HhInt iTimerID) 输入: iTimerID : 定时器编号(HhTimerStart生成) 输出: 无返回: 0 成功,其他值失败作用: 重启定时器 ***************************************************************************/ HhInt HhTimerReset(IN HhInt iTimerID) { LPTimerInfoDef pTimerInfo; HhInt iRet; if ((iTimerID < 0) || (iTimerID > MAX_TIMER_NUM)) { ldOutput(EN_ET_DEBUG, "[%s:%d]HhTimerReset();输入TimerID非法%d/n", __FILE__, __LINE__, iTimerID); return HH_FAIL; } HhLockGet(&g_TableLock); pTimerInfo = &(g_TimerTable[iTimerID]); if (pTimerInfo->blIsUsed) { pTimerInfo->iCounter = pTimerInfo->iCounterLen; iRet = HH_SUCCESS; } else { ldOutput(EN_ET_DEBUG, "[%s:%d]HhTimerReset():输入的TimerID没有使用, TimerID : %d", __FILE__, __LINE__, iTimerID); iRet = HH_FAIL; } HhLockRelease(&g_TableLock); return iRet; } /************************************************************************** 原型:HhInt HhTimerInit() 输入: 无输出: 无返回: 0 成功,其他值失败作用: 初始化定时器模块 ***************************************************************************/ HhInt HhTimerInit() { HhLockConstruct(&g_TableLock); if (HH_FAIL == Start10MStimer()) { ldOutput(EN_ET_DEBUG, "[%s:%d]HhTimerInit():打开10ms定时器失败", __FILE__, __LINE__); return HH_FAIL; } return HH_SUCCESS; } /************************************************************************** 原型:HhInt HhTimerUnInit() 输入: 无输出: 无返回: 0 成功,其他值失败作用: 反初始化定时器模块 ***************************************************************************/ HhInt HhTimerUnInit() { Stop10MSTimer(); HhLockDestruct(&g_TableLock); return HH_SUCCESS; }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值