欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

高性能秒级定时器SDK编程参考手册

程序员文章站 2022-05-29 23:46:23
...

 

 

  1.  概述

本文档适用于C/C++语言开发人员,用于在开发过程中进行参考,文档详细讲述秒级定时器相关函数的用法以及源码示例。

 

  1.  秒级定时器技术特点
  1. 定时器的实现采用双数组和双向链表数据结构。

 

2、支持超大规模数量定时器

支持设置的定时器的数量没有限制,主要受主机物理内存限制。

 

3、效率高

  设置和删除定时器的操作个定时器的数量操作,只涉及到数组元素地址定位,  

   和双向数组头部插入操作。

 

4、支持周期性时钟

    1)支持一次性时钟

   2) 支持指定周期时钟

   3) 支持无限周期时钟

   

5、指定时刻时钟。

    例如: 20200102030405,代表: 2020年1月2日3点4份5秒

 

6、设置时钟时可同时设置回调函数指针和输入参数。

 

  1.  定时时钟应用场景

精度精确到秒的应用场景。例如针对网络服务器程序:

1、连接远程服务器超时。

2、登录服务器超时。

3、周期性发送握手请求。

4、等待握手应答超时。

5、等待ACK超时。

6、其他周期性执行的任务情况。

7、定时执行任务的场景。

 

  1. 定时器管理器功能函数
  2.  TVSysCreate()

1、功能说明

此函数用来生成一个定时器管理器,执行成功后返回定时器管理器句柄,之后的操作都引用此句柄。

 

2、函数原型

HANDLE TVSysCreate(int nArraySize, time_t dtNow);

 

3、参数说明

  1. int nArraySize

输入参数, 时间轮数组的大小,必须大于1, 默认填写: 3600。

 

  1. time_t dtNow

输入参数, 当前时间戳。

 

4、返回值

执行成功时返回非NULL的句柄。

 

5、相关函数

   TVSysDestroy()

 

示例1:

功能:生成一个定时器管理器。

 

#include "TimerMng.h"

int main(int argc, char* argv[])

{

     time_t dtNow;

     time(&dtNow);

 

     HANDLE hTimerVM;

     hTimerVM = TVSysCreate(3600, dtNow);   

    

     TVSysDestroy(hTimerVM);

 

     return 0;

}

  1.  TVSysDestroy()

1、功能说明

此函数用来删除定时器管理器,删除后的句柄不能再被引用。

 

2、函数原型

int TVSysDestroy(HANDLE hTimerVM);

 

3、参数说明

   1)HANDLE hTimerVM

      输入参数,定时时钟管理器句柄。

 

4、返回值

    返回0

 

5、相关函数

   TVSysCreate()

 

  1.  定时器超时回调函数

 

1、回调函数调用时机

       当定时器超时时执行由TVSetTimerCycle和TVSetTimerAtTime设置的回调函数。

 

2、回调函数定义

 

typedef bool (* LPTIMEROUTPROC)(HANDLE hTimerVM, HANDLE hTimerItem,       void* pPara);

 

3、参数说明

   1)HANDLE hTimerVM

      输入参数, 定时时钟管理器句柄,此句柄由TVSysCreate函数生成。

 

2)HANDLE hTimer

输入参数, 当前处理定时器句柄,由调用函数TVSetTimerCycle、

TVSetTimerAtTime返回的句柄。

 

3)void* pPara

 输入参数,就是调用调用函数TVSetTimerCycle、TVSetTimerAtTime时的

用户参数。

 

4、返回值

    无。

 

 

  1.  TVSetTimerCycle()

1、功能说明

此函数用来设置周期性超时时钟。

 

2、函数原型

HANDLE TVSetTimerCycle(HANDLE hTimerVM, time_t dtNow,

       unsigned int dwCycle, unsigned int dwTimes,

       LPTIMEROUTPROC pProc, void* pPara);

 

3、参数说明

   1)HANDLE hTimerVM

      定时时钟管理器句柄,此句柄由TVSysCreate函数生成。

 

2)time_t dtNow

当前的时间戳。

 

3)unsigned int dwCycle

每次超时的间隔时长,单位为秒(s)。

 

4)unsigned int dwTimes

  超时的次数,如果设置为0xFFFFFFFF,则超时的次数无限制。

 

5)LPTIMEROUTPROC pProc

回调函数指针,在定时器超时时调用此函数,调用此函数的线程为调用

TVCheckTimeOut函数的线程。

 

6)void* pPara

   参数指针,在执行回调函数pProc时使用

   

4、返回值

    返回定时器句柄。

    1)NULL,设置定时器失败。

    2)其它,设置定时器成功。

 

5、相关函数  

TVSetTimeAtTime()

TVKillTimer()

 

  1.  TVSetTimerAtTime()

1、功能说明

此函数用来设置指定时刻的定时器,回调函数只被触发执行一次。

 

2、函数原型

HANDLE TVSetTimerAtTime(HANDLE hTimerVM, time_t dtNow, char*

    sDateTime, LPTIMEROUTPROC pProc, void* pPara);

 

3、参数说明

   1)HANDLE hTimerVM

      定时时钟管理器句柄,此句柄由TVSysCreate函数生成。

 

2)time_t dtNow

当前的时间戳。

 

3)指定超时时刻

格式为:YYYYMMDDHHMMSS。

    分别为:

(1)年(4个字符)、 

(2)月(2个字符)

    赋值范围:01~12

(3)日(2个字符)

    赋值范围:01~31

(4)小时(2个字符)

    赋值范围:00~23

(5)分钟(2个字符)

    赋值范围:00~59

(6)秒(2个字符)

    赋值范围:00~59

 

例如:如果要设置超时时刻为:2010年1月2日3时4分5秒触发的定

时器,sTimer值为:20100102030405

 

4)LPTIMEROUTPROC pProc

回调函数指针,在定时器超时时调用此函数,调用此函数的线程为调用

TVCheckTimeOut函数的线程。

 

5)void* pPara

   参数指针,在执行回调函数pProc时使用

   

4、返回值

   返回定时器句柄。

    1)NULL,设置定时器失败。

    2)其它,设置定时器成功。

 

5、相关函数  

TVSetTimeCycle()

 TVKillTimer()

 

  1.  TVKillTimer()

1、功能说明

此函数用来根据定时器句柄删除一个定时器。注意:达到定时触发次数的定时器是由管理器自动删除,不需要也不许可调用TVKillTimer。

 

2、函数原型

void TVKillTimer(HANDLE hTimerVM, HANDLE hTimer);

 

3、参数说明

   1)HANDLE hTimerVM

      定时器管理器句柄,此句柄由TVSysCreate函数生成。

 

2)HANDLE hTimer

要删除的定时器句柄,由调用函数TVSetTimerCycle、TVSetTimerAtTime

返回的句柄。

 

4、返回值

    无。

 

5、相关函数

 TVSetTimeCycle()

 TVSetTimeAtTime()

  1.  TVGetCount()

1、功能说明

此函数用来获取定时器管理器中目前设置的定时器总数。

 

2、函数原型

int TVGetCount(HANDLE hTimerVM);

 

3、参数说明

   1)HANDLE hTimerVM

      定时器管理器句柄,此句柄由TVSysCreate函数生成。

 

4、返回值

    返回定时器的数量,>= 0。

  

5、相关函数  

TVSetTimerCycle()

TVSetTimerAtTime()

TVKillTimer()

  1.  TVCheckTimeOut()

1、功能说明

此函数用来检查定时时钟管理器中的所有定时器,按照超时的递增顺序检

查,对每个超时的定时器执行回调函数,然后对超时次数减一,如果达到超

时次数,根据回调函数返回值来决定是否自动删除该定时器。此函数每秒要执行一次。

 

2、函数原型

void TVCheckTimeOut(HANDLE hTimerVM);

 

3、参数说明

   1)HANDLE hTimerVM

      定时时钟管理器句柄,此句柄由TVSysCreate函数生成。

 

4、返回值

    无

  

5、相关函数  

 

  1.  demo -指定时间定时器

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

// 回调函数

void TimeOutProc(HANDLE hTimerVM, HANDLE hTimerItem, void* pPara)
{	
	printf("定时器索引: %d \r\n", int(pPara));	
}

int main(int nArgc, char* sArgv[])
{
	time_t dtNow;
	time(&dtNow);

	HANDLE hTimerVM;	
	hTimerVM = TVSysCreate(3600, dtNow);		

	HANDLE hTimerArray[10];		

	hTimerArray[0] = TVSetTimerAtTime(hTimerVM, dtNow, "20200720115200", TimeOutProc, 
			(void*)0);		
	hTimerArray[1] = TVSetTimerAtTime(hTimerVM, dtNow, "20200720115200", TimeOutProc, 
			(void*)1);		
	hTimerArray[2] = TVSetTimerAtTime(hTimerVM, dtNow, "20200720115200", TimeOutProc, 
			(void*)2);		
	hTimerArray[3] = TVSetTimerAtTime(hTimerVM, dtNow, "20200720115200", TimeOutProc, 
			(void*)3);		
	hTimerArray[4] = TVSetTimerAtTime(hTimerVM, dtNow, "20200720115200", TimeOutProc, 
			(void*)4);		
	hTimerArray[5] = TVSetTimerAtTime(hTimerVM, dtNow, "20200720115200", TimeOutProc, 
			(void*)5);		
	hTimerArray[6] = TVSetTimerAtTime(hTimerVM, dtNow, "20200720115200", TimeOutProc, 
			(void*)6);		
	hTimerArray[7] = TVSetTimerAtTime(hTimerVM, dtNow, "20200720115200", TimeOutProc, 
			(void*)7);		
	hTimerArray[8] = TVSetTimerAtTime(hTimerVM, dtNow, "20200720115200", TimeOutProc, 
			(void*)8);		
	hTimerArray[9] = TVSetTimerAtTime(hTimerVM, dtNow, "20200720115200", TimeOutProc, 
			(void*)9);			

	while(TVGetCount(hTimerVM) > 0)
	{
		time_t dtLast;
		time(&dtLast);
		if(dtLast > dtNow)
		{
			TVCheckTimeOut(hTimerVM, dtNow);
			dtNow = dtLast;
		}		
		Sleep(1);	
	}	

	char sKey[32];
	gets(sKey);

	TVSysDestroy(hTimerVM);

	return 0;
}
  1.  demo - 周期性定时器

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

// 回调函数

void TimeOutProc(HANDLE hTimerVM, HANDLE hTimerItem, void* pPara)
{	
	printf("定时器索引: %d \r\n", int(pPara));	
}

int main(int nArgc, char* sArgv[])
{
	time_t dtNow;
	time(&dtNow);

	HANDLE hTimerVM;	
	hTimerVM = TVSysCreate(3600, dtNow);		

	HANDLE hTimerArray[10];

	int i;
	for (i = 0; i < 10; i++)
	{
		hTimerArray[i] = TVSetTimerCycle(hTimerVM, dtNow, 1, 10, TimeOutProc, (void *)i);
	}

	while(TVGetCount(hTimerVM) > 0)
	{
		time_t dtLast;
		time(&dtLast);
		if(dtLast > dtNow)
		{
			TVCheckTimeOut(hTimerVM, dtNow);
			dtNow = dtLast;
		}		
		Sleep(1);	
	}	

	char sKey[32];
	gets(sKey);

	TVSysDestroy(hTimerVM);

	return 0;
}

  1.  注意事项

1、使用才定时器SDK,系统的时间不可更改,否则会造成软件运行异常。

2、注意,定时器时钟必须删除,否则会造成内存泄漏。

3、时钟管理器是线程不安全,如果是由多线程操作必须加互斥锁。