精华内容
下载资源
问答
  • 1. 大致功能介绍实现任务列表,定时器会间隔一段时间遍历列表发现要执行的任务任务列表中的所有任务并行执行每个任务都可以有自己的定时器,并且可以选择是否要重复执行定义方便的任务函数实现接口定时器可以由用户...

    1. 大致功能介绍

    实现任务列表,定时器会间隔一段时间遍历列表发现要执行的任务

    任务列表中的所有任务并行执行

    每个任务都可以有自己的定时器,并且可以选择是否要重复执行

    定义方便的任务函数实现接口

    定时器可以由用户自定义何时启动和停止

    提供等待功能,保证任务列表中的所有任务执行完成

    提供任务列表的传参功能

    2. API库介绍

    void setTick(int val);

    设置定时间的间隔时间tick,若设置tick为1000,且任务的定时器时间为1000,则任务会在1秒后执行,默认tick为1秒,最小tick时间为1us。

    void addTimerTask(TimerTask task, int val, int autoreset, void *arg);

    向任务列表注册一个任务,并指定其定时时间val,以及是否要重复执行autoreset,并可以指定参数的地址。

    task需要按照头文件提供的宏来编写,例如:

    TASK_START(test2, arg)

    //body

    Arg *temp = (Arg*)arg;

    temp->ret = temp->a + temp->b;

    printf("This is a test2\n");

    TASK_END

    TASK_START(name, arg)是任务头,name是任务名,arg是参数地址,TASK_END是任务结尾。任务体内可编写正常的c语言代码,并使用参数arg指针。

    autoreset有两个可选项:AUTORESET(重复执行),NORESET(执行一次)。

    若没有参数,可将arg参数设置为NULL。

    void TimerWait();

    用于等待任务列表中所有任务执行完毕。

    void TimerStop();

    用于停止定时器。

    void StartTimer();

    用于启动定时器。

    3. 一个例子

    #include

    #include "timer.h"

    typedef struct Argument{

    int a;

    int b;

    int ret;

    }Arg;

    //任务1,打印语句

    TASK_START(test1, arg)

    printf("This is a test1\n");

    TASK_END

    //任务2,计算arg中两个数的和,打印语句

    TASK_START(test2, arg)

    Arg *temp = (Arg*)arg;

    temp->ret = temp->a + temp->b;

    printf("This is a test2\n");

    TASK_END

    //任务3,打印语句

    TASK_START(test3, arg)

    printf("This is a test3\n");

    TASK_END

    void main(){

    Arg arg;

    //设置tick 为 500ms

    setTick(500 * 1000);

    //添加任务1到任务列表,设置定时器时间为2.5s,重复执行,无参数

    addTimerTask(test1, 5, AUTORESET, NULL);

    arg.a = 2; arg.b = 3;

    //添加任务2到任务列表,设置定时器时间为0.5s,不重复执行,参数为arg

    addTimerTask(test2, 1, NORESET, &arg);

    //添加任务3到任务列表,设置定时器时间为1s,重复执行,无参数

    addTimerTask(test3, 2, AUTORESET, NULL);

    //启动定时器

    StartTimer();

    printf("Timer is started\n");

    //程序等待5秒

    sleep(5);

    //停止定时器

    TimerStop();

    //等待所有任务执行完毕

    TimerWait();

    //打印任务二的计算结果

    printf("%d\n", arg.ret);

    }

    运行结果:

    fc2f4497fea03665fda6edb11f648151.png

    4. 库文件源码

    timer.h:

    #ifndef TIMER_H

    #define TIMER_H

    #include

    #include

    #include

    #include

    #include

    #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_H

    timer.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");

    }

    }

    注意事项

    编译要加 -l pthread选项

    库实现在Linux环境,如果是windows需要修改线程创建函数,休眠函数以及相应的头文件。

    如有问题及建议可留言,另外创作不易,还望一键三连,多多支持博主,谢谢各位啦~~

    展开全文
  • 1. 大致功能介绍实现任务列表,定时器会间隔一段时间遍历列表发现要执行的任务任务列表中的所有任务并行执行每个任务都可以有自己的定时器,并且可以选择是否要重复执行定义方便的任务函数实现接口定时器可以由用户...

    1. 大致功能介绍

    实现任务列表,定时器会间隔一段时间遍历列表发现要执行的任务

    任务列表中的所有任务并行执行

    每个任务都可以有自己的定时器,并且可以选择是否要重复执行

    定义方便的任务函数实现接口

    定时器可以由用户自定义何时启动和停止

    提供等待功能,保证任务列表中的所有任务执行完成

    提供任务列表的传参功能

    2. API库介绍

    void setTick(int val);

    设置定时间的间隔时间tick,若设置tick为1000,且任务的定时器时间为1000,则任务会在1秒后执行,默认tick为1秒,最小tick时间为1us。

    void addTimerTask(TimerTask task, int val, int autoreset, void *arg);

    向任务列表注册一个任务,并指定其定时时间val,以及是否要重复执行autoreset,并可以指定参数的地址。

    task需要按照头文件提供的宏来编写,例如:

    TASK_START(test2, arg)

    //body

    Arg *temp = (Arg*)arg;

    temp->ret = temp->a + temp->b;

    printf("This is a test2\n");

    TASK_END

    TASK_START(name, arg)是任务头,name是任务名,arg是参数地址,TASK_END是任务结尾。任务体内可编写正常的c语言代码,并使用参数arg指针。

    autoreset有两个可选项:AUTORESET(重复执行),NORESET(执行一次)。

    若没有参数,可将arg参数设置为NULL。

    void TimerWait();

    用于等待任务列表中所有任务执行完毕。

    void TimerStop();

    用于停止定时器。

    void StartTimer();

    用于启动定时器。

    3. 一个例子

    #include

    #include "timer.h"

    typedef struct Argument{

    int a;

    int b;

    int ret;

    }Arg;

    //任务1,打印语句

    TASK_START(test1, arg)

    printf("This is a test1\n");

    TASK_END

    //任务2,计算arg中两个数的和,打印语句

    TASK_START(test2, arg)

    Arg *temp = (Arg*)arg;

    temp->ret = temp->a + temp->b;

    printf("This is a test2\n");

    TASK_END

    //任务3,打印语句

    TASK_START(test3, arg)

    printf("This is a test3\n");

    TASK_END

    void main(){

    Arg arg;

    //设置tick 为 500ms

    setTick(500 * 1000);

    //添加任务1到任务列表,设置定时器时间为2.5s,重复执行,无参数

    addTimerTask(test1, 5, AUTORESET, NULL);

    arg.a = 2; arg.b = 3;

    //添加任务2到任务列表,设置定时器时间为0.5s,不重复执行,参数为arg

    addTimerTask(test2, 1, NORESET, &arg);

    //添加任务3到任务列表,设置定时器时间为1s,重复执行,无参数

    addTimerTask(test3, 2, AUTORESET, NULL);

    //启动定时器

    StartTimer();

    printf("Timer is started\n");

    //程序等待5秒

    sleep(5);

    //停止定时器

    TimerStop();

    //等待所有任务执行完毕

    TimerWait();

    //打印任务二的计算结果

    printf("%d\n", arg.ret);

    }

    运行结果:

    a9367e999e28d1dd219178bb981f259b.png

    4. 库文件源码

    timer.h:

    #ifndef TIMER_H

    #define TIMER_H

    #include

    #include

    #include

    #include

    #include

    #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_H

    timer.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");

    }

    }

    注意事项

    编译要加 -l pthread选项

    库实现在Linux环境,如果是windows需要修改线程创建函数,休眠函数以及相应的头文件。

    到此这篇关于C语言实现多线程定时器实例讲解的文章就介绍到这了,更多相关C语言如何实现多线程定时器内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

    展开全文
  • Java多线程 定时器

    2021-03-08 05:20:31
    package timer;import java.util.concurrent.PriorityBlockingQueue;public class MyTimer {PriorityBlockingQueue queue = new PriorityBlockingQueue<>();Worker worker;private static class Worker extend...

    package timer;

    import java.util.concurrent.PriorityBlockingQueue;

    public class MyTimer {

    PriorityBlockingQueue queue = new PriorityBlockingQueue<>();

    Worker worker;

    private static class Worker extends Thread {

    PriorityBlockingQueue queue;

    Worker(PriorityBlockingQueue queue) {

    this.queue = queue;

    }

    @Override

    public void run() {

    while (true) {

    try {

    MyTimerTask task = queue.take();

    long current = System.currentTimeMillis();

    if (task.delay <= current) {

    task.target.run();

    } else {

    queue.put(task);

    Thread.sleep(task.delay - current);

    }

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    }

    }

    }

    MyTimer() {

    worker = new Worker(queue);

    worker.start();

    }

    void execute(Runnable target, long delay) {

    queue.put(new MyTimerTask(target, delay));

    }

    public static void main(String[] args) {

    MyTimer timer = new MyTimer();

    timer.execute(new Runnable() {

    @Override

    public void run() {

    System.out.println("该起床了");

    }

    }, 2000);

    System.out.println("另一个人");

    }

    }

    package timer;

    public class MyTimerTask implements Comparable {

    Runnable target;

    long delay;

    MyTimerTask(Runnable target, long delay) {

    this.target = target;

    this.delay = System.currentTimeMillis() + delay;//延时后的时刻

    }

    @Override

    public int compareTo(MyTimerTask o) {

    if (delay == o.delay) {

    //延时后的时刻

    return 0;

    } else if (delay < o.delay) {

    return -1;

    } else {

    return 1;

    }

    }

    }

    原文:https://blog.51cto.com/14232658/2470169

    展开全文
  • 多线程定时器--C语言

    2021-03-25 09:31:09
    参考:C定时器实现_c定时器,c定时器-C代码类资源-CSDN下载 /unit-0.1/test/nxt_rbtree1.c //util_timer.c static void UtilSetNonBlocking(int sock) { int opts; opts=fcntl(sock,F_GETFL); if(opts) { perror(...

    参考:C定时器实现_c定时器,c定时器-C代码类资源-CSDN下载

    /unit-0.1/test/nxt_rbtree1.c

    //util_timer.c
    static void UtilSetNonBlocking(int sock)
    {
         int opts;
         opts=fcntl(sock,F_GETFL);
         if(opts<0)
         {
              perror("fcntl(sock,GETFL)");
              exit(1);
         }
         opts = opts|O_NONBLOCK;
         if(fcntl(sock,F_SETFL,opts)<0)
         {
              perror("fcntl(sock,SETFL,opts)");
              exit(1);
         }  
    }
    

    gcc -pthread -D_DEBUG app_main.c util_rbtree.c util_timer.c -o timer.bin

    gcc -I./include -L./lib  -o app.bin  -lpthread -lm  ./main/*.c  ./source/*.c ./lib/libqkssdk.a 

    展开全文
  • 一、功能:Linux下编写一个程序库,实现定时器的功能,它能为用户提供在同一进程中次使用的定时器。二、实现#include #include #include #include #include #include #include #include #define DEFAULT_INTERVAL 1...
  • 定时器是一个线程工具,可以用于调度个定时任务以后台线程方式运行。 比如说,在开发中,我们需要做一些周期性的操作,比如每隔三分钟就清空一次文件夹,用定闹钟的方式人为的清空肯定是不合适的。这时就可以...
  • 多线程和多进程的区别: 比如你有好几个python的代码文件,如果你把他们都打开,都开始执行,那么这些同时被执行的文件再电脑中,就是多个进程。 如果你执行的一个文件中,代码执行的顺序就是一个劲往下执行,只专注...
  • 多线程 资料来源链接: 菜鸟教程. Python中使用线程有两种方式:函数或者用类来包装线程对象。 函数式:调用 _thread 模块中的start_new_thread()函数来产生新线程。语法如下: _thread.start_new_thread ( function, ...
  • 在Java中Timer是java.util包中的一个工具类,提供了定时器的功能。我们可以创建一个Timer对象,然后调用其schedule方法在某个特定的时间去执行一个特定的任务。并且你可以让其以特定频率一直执行某个任务,这个任务...
  • 定时器与单例模式本次更新的主要内容是多线程中的定时器Timer和单例模式,本来打算分两次更新的,这次就在一起更新了。这次更新完之后,多线程的基础理论知识系列就完结了,后续会发布Mysql的内部技术分析,多线程...
  • step1:添加声明DWORDWINAPITimerThread(LPVOIDpamaram);...//step2:开辟线程InitializeCriticalSection(&g_cs);//先初始化临界区HANDLEShowT1=CreateThread(NULL,0,TimerThread,this,NULL,NULL);/...
  • 定时计划任务功能在Java中主要使用的就是Timer对象,它在内部使用多线程方式进行处理,所以它和多线程技术关联还是相当大的。那和ThreadLocal一样,还是先讲原理再讲使用,Timer的实现原理不难,就简单扫一下就好了...
  • 定时功能在java中主要使用的就是Timer对象,他在内部使用的就是多线程的技术.Time类主要负责完成定时计划任务的功能,就是在指定的时间的开始执行某个任务.Timer类的作用是设置计划任务,而封装任务内容的类是TimerTask...
  • Linux环境编程多线程定时器、延时队列以及分布式定时器的现实与原理分析丨线程池丨中间件丨后端开发丨C/C++linux服务器开发 视频讲解如下,点击观看: Linux环境编程多线程定时器、延时队列以及分布式定时器的现实...
  • Java的多线程定时器

    2021-03-22 17:44:56
    Java写的一个定时器多线程:/** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* and open the template in the ...
  • 线程定时器的区别

    千次阅读 2021-01-05 10:47:21
    多线程3. 比较总结 1. 软件定时器 优点:使用简单,仅需设置一个时长和其OnTime事件即可使用。 缺点: (1)速度方面,软件定时器的精度比较低,这是由Windows不实时的特性所决定的,在XP下,如果关闭所有能...
  • 参考:http://codereview.stackexchange.com/questions/40915/simple-multithread-timer本文实现了一个多线程C++定时器,具备设置singleshot,start(),stop()等功能。代码如下:Timer.h:#ifndef TIMER_H#define ...
  • 是不是多线程定时器有冲突? ======================================================================================== timer控件引用的是Sytem.Windows.Forms.Timer类。 Windows 计时器是为单线程环境设计的...
  • 这里就涉及到选择定时任务还是开线程的问题 分析 定时器 优点:使用简单,仅需设置一个时长和其OnTime事件即可使用。 缺点:之前写定时器去刷银行接口,我一直任务是并行执行的,但是在一次失误中,导致整个定时任务...
  • 点击关注公众号,实用技术文章及时了解来源:blog.csdn.net/cssnnd/article/details/108328942战术分析:实际开发项目中一定不止一个定时器,很场景都...
  • 下面从单线程和多线程两个方面实现定时器的功能。1、单线程(schedule)首先我们需要一个单独的定时任务类,继承TimerTask,用来表示具体的定时任务,单独提出来封装成一个类,方便管理和实现:import java.util.Timer...
  • 多线程定时器

    2021-04-25 17:44:22
    import java.text.SimpleDateFormat; import java.util.Date;...public class ThreadTest定时器 { public static void main(String[] args) throws Exception{ //定时器对象 Timer timer = new Timer();
  • 定时器可以强制终止请求:浏览器内部都有一个定时器,发送了请求之后,定时器就开始计时。如果在打开浏览界面的时候,浏览器的响应时间过了响应时间,就会强制终止请求。 1.定时器的构成 1.使用一个类来描述“一个...
  • 1 :固定时间后执行一次任务:1000毫秒后执行任务(只执行一次) 2: 5000毫秒后,执行任务,... } } } 更多 多线程_几种定时器的写法相关文章请关注PHP中文网! 本文原创发布php中文网,转载请注明出处,感谢您的尊重!
  • 如果是进程, 那就需要借助共享内存传递一个标志信号, 而线程本身就共享一个线程的内存空间, 所以, 为了解决以上问题, threading 模块为我们提供了一个 Event 对象 1.Event 对象的方法 Event 本质就是一个标志, True...
  • 写一个例子时弄的,网上说精度不太行 #include "stdafx.h" #include <iostream> #include <Windows.h>...void CALLBACK TimeProc(HWND hwnd, UINT message, UINT idTimer, ... //在你新开线程中执行的函
  • 上一篇文章介绍了Runable、匿名类、带返回值的线程创建方式接下来我们这篇要介绍使用定时器、线程池、Lambda表达式等方式来创建一、使用定时器创建线程定时器其实也是相当于开辟一个线程来进行执行定时任务,就是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 77,145
精华内容 30,858
关键字:

多线程定时器的工作方式

友情链接: easytolearnvc.rar