时间:2021-05-20
设置定时间的间隔时间tick,若设置tick为1000,且任务的定时器时间为1000,则任务会在1秒后执行,默认tick为1秒,最小tick时间为1us。
void addTimerTask(TimerTask task, int val, int autoreset, void *arg);向任务列表注册一个任务,并指定其定时时间val,以及是否要重复执行autoreset,并可以指定参数的地址。
task需要按照头文件提供的宏来编写,例如:
TASK_START(name, arg)是任务头,name是任务名,arg是参数地址,TASK_END是任务结尾。任务体内可编写正常的c语言代码,并使用参数arg指针。
autoreset有两个可选项:AUTORESET(重复执行),NORESET(执行一次)。
若没有参数,可将arg参数设置为NULL。
void TimerWait();用于等待任务列表中所有任务执行完毕。
void TimerStop();用于停止定时器。
void StartTimer();用于启动定时器。
运行结果:
timer.h:
#ifndef TIMER_H#define TIMER_H#include <unistd.h>#include <stdio.h>#include <pthread.h>#include <stdlib.h>#include <signal.h>#define AUTORESET 1#define NORESET 0#define TASK_START(name, arg) void* name(void *arg){#define TASK_END return NULL;} typedef void* (*TimerTask)(void* arg);struct TaskItem{ TimerTask task; int init_counter; int counter; pthread_t th; void *arg; void *ret; int flag; int autoreset; struct TaskItem *next; };void setTick(int val);void* EventLoop(void* arg);void addTimerTask(TimerTask task, int val, int autoreset, void *arg);void TimerWait();void TimerStop();void StartTimer();#endif //TIMER_Htimer.cpp
#include "timer.h"#define STOPFLAG 0#define RUNFLAG 1 static int tick = 1000 * 1000;static struct TaskItem head = { .next = NULL,};static pthread_t loop_thread;static int flag = STOPFLAG;static int tasknum = 0;void setTick(int val){ tick = val;}void* EventLoop(void* arg){ struct TaskItem *task = head.next; struct TaskItem *pretask = &head; while(flag == RUNFLAG && tasknum > 0){ while(task != NULL){ if(task->counter == 0){ // it is time for doing task if(task->flag == STOPFLAG){ // task is not created if(0 != pthread_create(&(task->th), NULL, task->task, task->arg)){ // do a task printf("Failed to create user's task"); } else{ task->flag = RUNFLAG; } } else{ if(0 != pthread_kill(task->th, 0)){ // current task is completed if(task->autoreset == AUTORESET){ // repeat execute task->counter = task->init_counter; task->flag = STOPFLAG; } else{ // delete a task pretask->next = task->next; free(task); task = pretask->next; tasknum--; continue; } } } } else{ task->counter--; } pretask = pretask->next; task = task->next; } usleep(tick); // sleep a tick task = head.next; pretask = &head; } flag = STOPFLAG;}void addTimerTask(TimerTask task, int val, int autoreset, void *arg){ struct TaskItem *node; node = (struct TaskItem*)malloc(sizeof(struct TaskItem)); node->next = head.next; head.next = node; node->arg = arg; node->counter = val; node->init_counter = val; node->task = task; node->flag = STOPFLAG; node->autoreset = autoreset; tasknum++;}void TimerWait(){ pthread_join(loop_thread, NULL);}void TimerStop(){ flag = STOPFLAG;}void StartTimer(){ flag = RUNFLAG; if(0 != pthread_create(&loop_thread, NULL, EventLoop, NULL)){ printf("Failed to create loop task.\n"); }}到此这篇关于C语言实现多线程定时器实例讲解的文章就介绍到这了,更多相关C语言如何实现多线程定时器内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了C#多线程学习之使用定时器进行多线程的自动管理。分享给大家供大家参考。具体分析如下:Timer类:设置一个定时器,定时执行用户指定的函数。定时器启
定时器timer是多线程编程中经常设计到的工具类定时器的原理其实很简单:创建一个新线程在那个线程里等待等待指定时长后做任务这里用C++11实现了一个简单易用的定
本文实例为大家分享了C语言实现简单的定时器的具体代码,供大家参考,具体内容如下1.代码分析2.代码#include#include#include#ifndef
背景我们知道在.NETFramework中存在四种常用的定时器,他们分别是:1两个是通用的多线程定时器:System.Threading.TimerSystem
本文实例讲述了python通过线程实现定时器timer的方法。分享给大家供大家参考。具体分析如下:这个python类实现了一个定时器效果,调用非常简单,可以让系