Linux 定时器3

使用一个线程维护该软定时器,满足一般软件需求:

 

 

    ret = pthread_create(&threadid_timer,NULL,timer_task_func,NULL);
        if(ret != 0) perror("threadid_timer err: \n");


相关源码:

 

 

 

#define  TASKMAX 12

TIMER_TASK Timer_Task[TASKMAX]={0};
static int task_num = TASKMAX;
TIMER_PROCESS TimerTask = {NULL,NULL,NULL,NULL,NULL};
/*****************************************************************************
功    能: 控制器定时器,供外部所有模块使用
参    数:定时器间隔时间、定时器序号,定时器注册回调函数,回调函数参数
返回值:正确:返回
错误:
*****************************************************************************/


int timer_task_create(int interval_timer,int task_no,Timer_Call_Back_Function func,void *param) // 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 the 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;
                    Timer_Task[i].Timer.callback = func;
                    Timer_Task[i].Timer.param = param;
                    task_num --;

                    printf("[Info]:timer task %d callback addr =%p regesiter success\n",task_no,func);
                    return 1;
            }
        }
    }
return 0;
}

int timer_task_delete(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("[Info]:timer task %d is deleted \n",task_no);
            task_num --;
            return 1;;
        }
    }
}

 void * timer_task_func(void *param)
{
    int pid = getpid();
    signal(SIGALRM,task_timer);  //接到SIGALRM信号,则执行timeout函数
    while(1)
    {
        kill(pid,SIGALRM);
        usleep(1000*0.9);
    }
}

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
        {
            if(Timer_Task[j].Timer.callback != NULL)
            {
                Timer_Task[j].Timer.callback(Timer_Task[j].Timer.param);
            }
            Timer_Task[j].Timer.left_time=Timer_Task[j].Timer.total_time;     //循环计时

        }
    }
}


相关头文件:其他一些 需要的系统库头文件使用时自己添加,编译的时候自己根据提示添加一下,编译时 -L pthread  上面printf 打印的颜色宏可以自己去掉,因为该部分是从其他部分获取的,该部分放在其他地方,我获取不到就不一一添加上去了。。

 

 

#ifndef _QX_TIMER_H
#define _QX_TIMER_H

typedef int (*Timer_Call_Back_Function) (void* param);/*返回任意类型,传入任意类型参数*/

typedef struct timer        //Timer结构体,用来保存一个定时器的信息
{
    int total_time; //每隔total_time秒
    int left_time;  //还剩left_time秒
    int (*callback)(void *param);/*返回任意类型,传入任意类型参数*/
    void *param;
    unsigned char  occupyed;
}TIMER;


typedef struct
{
    TIMER Timer;
    int task_no;

}TIMER_TASK;

typedef struct
{
    int Counter;
    char Clear;
}TIME3COUNTER;

typedef int (callback_function_timer)();


int timer_task_create(int interval_timer,int task_no,Timer_Call_Back_Function func,void *param);
int timer_task_delete(int task_no);
void * timer_task_func(void *param);
void task_timer( int sig);

#endif // _QX_TIMER_H

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值