int TimerTaskCreate(int interval_timer,int task_no) // ms 单位 1000ms = 1sec
{
TIMER a;
if(interval_timer < 0)
return -1;
a.total_time = interval_timer;
a.left_time = interval_timer;
a.occupyed = 1;
if(task_num > TASKMAX||task_no < 0)
{
printf(RED"[Info]:timer task %d regesiter failed ,because max timer task is limted 10\n"NONE,task_no);
return -1;
}
for(int i =0 ; i < TASKMAX; i++)
{
if(Timer_Task[i].task_no == task_no)
{
printf(RED"[Info]:timer task %d regesiter failed ,because timer task no is used\n"NONE,task_no);
return -1;
}
else
{
if(Timer_Task[i].Timer.occupyed == 0)
{
Timer_Task[i].Timer = a;
Timer_Task[i].task_no = task_no;
task_num --;
printf(RED"[Info]:timer task %d regesiter success \n"NONE,task_no);
// printf("i->%d %d %d %d\n",i,Timer_Task[i].task_no,Timer_Task[i].Timer.occupyed,Timer_Task[i].Timer.left_time);
return 1;
}
}
// printf("%d %d %d \n",Timer_Task[i].task_no,Timer_Task[i].Timer.occupyed,Timer_Task[i].Timer.left_time);
}
return 0;
}
上面是注册定时器任务函数
下面是删除定时器任务函数
int TimerTaskDelete(int task_no)
{
for( int i =0;i< TASKMAX ; i++ )
{
if(Timer_Task[i].task_no == task_no)
{
memset(&Timer_Task[i],0x00,sizeof(TIMER_TASK));
printf(RED"[Info]:timer task %d is deleted \n"NONE,task_no);
task_num --;
return 1;;
}
}
}
下面的是利用信号的原理去轮询检测每个被创建的任务触发时间。
void * Timer_Task_Func(void *param)
{
TimerTaskCreate(6500,1);
TimerTaskCreate(500,2);
TimerTaskCreate(200,3);
TimerTaskCreate(1000,4);
// TimerTaskCreate(2000,9);
int pid = getpid();
signal(SIGALRM,Task_Timer); //接到SIGALRM信号,则执行timeout函数
while(1)
{
kill(pid,SIGALRM);
usleep(1000*0.9); //精度1ms
}
}
typedef struct timer //Timer结构体,用来保存一个定时器的信息
{
int total_time; //每隔total_time秒
int left_time; //还剩left_time秒
// int func; //该定时器超时,要执行的代码的标志
unsigned char occupyed;
}TIMER;
typedef struct
{
TIMER Timer;
int task_no;
}TIMER_TASK;
下面的是每个任务的执行逻辑代码部分,该部分的case里的执行代码程序部分也可以通过在上述结构体里添加一个函数指针的方式来实现,例如在创建任务的时候,同时把要执行的函数的的地址指向该结构体里的函数指针即可。
void Task_Timer( int sig)
{
for(int j=0; j < TASKMAX; j++)
{
if(Timer_Task[j].Timer.left_time!=0)
Timer_Task[j].Timer.left_time--;
else
{
switch(Timer_Task[j].task_no)
{
case 1:
// Qx_Log_ptr->Log_Buffer_Cache_Store("this is test !\n",8);
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
break;
case 8:
break;
case 9:
break;
case 10:
break;
default:
break;
}
Timer_Task[j].Timer.left_time=Timer_Task[j].Timer.total_time; //循环计时
}
}
}
TIMER_TASK Timer_Task[TASKMAX]={0}; //申明
static int task_num = TASKMAX;//注册任务的最大个数
#define TASKMAX 12
目前最大的精度是到1ms