linux 定时器2
来源:互联网 发布:qq软件怎么升级 编辑:程序博客网 时间:2024/06/03 23:56
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
0 0
- linux tcp定时器2
- linux 定时器2
- linux定时器
- linux定时器
- Linux 定时器
- linux 定时器
- linux定时器
- Linux 定时器
- Linux定时器
- Linux:定时器
- linux 定时器
- linux 定时器
- linux 定时器
- linux 定时器
- linux定时器
- linux 定时器
- linux定时器
- linux 定时器
- 对抗样本和对抗网络
- OC学习日记017(二)从网络下载图片放到UI界面
- 香山游记2015
- Linux线程编程 - 多线程异步管理之信号
- 使用office word编辑论文的一些方法
- linux 定时器2
- 输出1到N之间所有相加最接近M的数字组合【可参考更改为背包算法】
- 组件清单
- Word2010图片组合
- HTTP协议
- 基于docker的IBM区块链项目展示
- ie9以下兼容background-size属性
- JAVA并发编程学习笔记之CAS操作
- HTTP Methods 和 RESTful Service API 设计