Timer定时器开发

定时器的作用是不占线程的等待一个确定时间,同样通过callback来通知定时器到期。

参考:https://github.com/sogou/workflow

定时器的创建

同样是在WFTaskFactory类里的方法:

using timer_callback_t = std::function<void (WFTimerTask *)>;

class WFTaskFactory

{

...

static WFTimerTask *create_timer_task(unsigned int microseconds,

timer_callback_t callback);

};

第一个参数为定时时间,单位为微秒。除了程序退出,定时器不可以提前结束。

定时器任务里同样有user_data域可以用来传递一些用户数据。启动方法和接入任务流的方法与其它任务没有区别。

定时器的一个高级特征

关于程序退出里讲到,main函数结束或exit()被调用的时候,所有任务必须里运行到callback,并且没有新的任务被调起。

这们就可能出现一个问题,定时器的最长定时时间超过了1小时,并且不能主动打断。如果等定时器到期,程序退出需要很长时间。

而实现上,程序退出是可以打断定时器,让定时器回到callback的。如果定时器被程序退出打断,get_state()会得到一个WFT_STATE_ABORTED状态。

当然如果定时器被程序退出打断,则不能再调起新的任务。

以下这个程序,每间隔一秒抓取一个一个http页面。当所有url抓完毕,程序直接退出,不用等待timer回到callback,退出不会有延迟。

bool
program_terminate = false;

void timer_callback(WFTimerTask
*timer)

{

mutex.lock();

if
(!program_terminate)

{

WFHttpTask *task;

if (urls_to_fetch
> 0)

{

task = WFTaskFactory::create_http_task(...);

series_of(timer)->push_back(task);

}

series_of(timer)->push_back(WFTaskFactory::create_timer_task(1000000,
timer_callback));

}

mutex.unlock();

}

...

int main()

{

....

/* all urls done */

mutex.lock();

program_terminate = true;

mutex.unlock();

return 0;

}

以上程序,timer_callback必须在锁里判断program_terminate条件,否则可能在程序已经结束的情况下又调起新任务。 由于使用上有一定难度,程序应该尽量避免使用这个特征,而应该等所有定时器都回到callback,再结束程序。

定时时间不够用怎么办

目前定时器最长定时用期约4200秒,如果程序的任务为24小时启动一次,则需要一个24小时的定时。可以简单地添加多个定时器。

例如:

void timer_callback(WFTimerTask
*timer)

{

mutex.lock();

if (program_terminate)

series_of(timer)->cancel();

mutex.unlock();

}

void my_callback(WFMyTask *task)

{

SeriesWork *series = series_of(task);

WFTimerTask *timer;

for (int i = 0; i < 24; i++)

{

timer = WFTaskFactory::create_timer_task(3600U*1000*1000,
timer_callback);

series->push_back(timer);

}

WFMyTask *next_task = MyFactory::create_my_task(...,
my_callback);

series->push_back(next_task);

}

因为timer_task是一种耗费资源非常小的任务,所以可以创建非常多的timer。上例中创建24个1小时的定时器,每24小时执行一个任务。

例子中也考虑了程序随时可以退出的问题。在timer的callback里发现程序已经退出,需要cancel余下的任务。

虽然我们的定时器可以被程序退出中断,而且我们也支持把多个定时器串起来,实现一个很长的定时, 但这都不是我们推荐的做法。大多数情况下应该避免太长时间的定时,并且应该等所有定时器到期再结束程序。

Timer定时器开发的更多相关文章

  1. .net中 Timer定时器

    作者:feiying008 在开发一套视觉系统时,发现系统内存一直不断增加,直至系统内存爆满.一开始还以为是程序内存泄露,是图像操作算法写的有问题,但是,发现如果电机轴如果 不运行的状态下,每隔一秒进 ...

  2. C#中WebService 的 Timer定时器过段时间后自动停止运行

    我用.net做的一个Timer定时器,定时获取短信并给予回复,但大概过了十几个小时以后,Timer定时器会自动停止,再发送短信就不能收到回复,需要在服务器中重新运行定时器才可以,请教各位! 我是在.n ...

  3. asp.net中Timer定时器在web中无刷新的使用

    最近在做一个项目的时候,web端的数据需要与数据源进行实时同步,并保证数据的准确性,当时,考虑到使用ajax异步刷新技术.但后来在网上查找相关资料时,发现这样做,太浪费资源了,因为ajax的提交请求不 ...

  4. JAVA Timer定时器使用方法(二)

    JAVA  Timer 定时器测试 MyTask.java:package com.timer; import java.text.SimpleDateFormat;import java.util. ...

  5. C#中Timer定时器的使用示例

    关于C#中timer类 在C#里关于定时器类就有3个: 1.定义在System.Windows.Forms里 2.定义在System.Threading.Timer类里 3.定义在System.Tim ...

  6. [Python 多线程] Timer定时器/延迟执行、Event事件 (七)

    Timer继承子Thread类,是Thread的子类,也是线程类,具有线程的能力和特征.这个类用来定义多久执行一个函数. 它的实例是能够延迟执行目标函数的线程,在真正执行目标函数之前,都可以cance ...

  7. 浅析linux内核中timer定时器的生成和sofirq软中断调用流程(转自http://blog.chinaunix.net/uid-20564848-id-73480.html)

    浅析linux内核中timer定时器的生成和sofirq软中断调用流程 mod_timer添加的定时器timer在内核的软中断中发生调用,__run_timers会spin_lock_irq(& ...

  8. 浅析linux内核中timer定时器的生成和sofirq软中断调用流程【转】

    转自:http://blog.chinaunix.net/uid-20564848-id-73480.html 浅析linux内核中timer定时器的生成和sofirq软中断调用流程 mod_time ...

  9. 关于C#中Timer定时器的重入问题解决方法(也适用于多线程)

    项目中用到了定时器随着服务启动作定时任务,按指定的准点时间定时执行相关操作,但是在指定准点时间内我只想让它执行一次,要避免重入问题的发生. 首先简单介绍一下timer,这里所说的timer是指的Sys ...

随机推荐

  1. 硬盘分区形式(MBR、GPT)、系统引导、文件系统、Inode和Block

    目录 MBR和GPT MBR的局限性 GPT的优势 主分区.扩展分区和逻辑分区 挂接卷 Legacy.UEFI引导和GRUB引导 文件系统(FAT16.32.NTFS和EXT2.3.4.Xfs.Tmp ...

  2. POJ 2135 简单费用流

    题意:       题意是一个人他要从牧场1走到牧场n然后在走回来,每条路径只走一次,问全程的最短路径是多少. 思路:        这个题目挺简单的吧,首先要保证每条边只能走一次,然后还要要求费用最 ...

  3. Linux中正则表达式和字符串的查询、替换(tr/diff/wc/find)

    目录 正则表达式 基本正则表达式 扩展正则表达式 grep tr diff du wc find 正则表达式 正则表达式,又称正规表示法.常规表示法( Regular Expression,在代码中常 ...

  4. Windows Pe 第三章 PE头文件(下)

    3.5  数据结构字段详解 3.5.1  PE头IMAGE_NT_HEADER的字段 1.IMAGE_NT_HEADER.Signature +0000h,双字.PE文件标识,被定义为00004550 ...

  5. Debuggee not connected 寒江孤钓<<windows 内核安全编程>> 学习笔记

    双机联调出现的问题 真机系统win7 虚拟机系统xp 安装书中的配置一步一步走,发现最后启动系统后,windbg一直显示 Opened \\.\pipe\com_1Waiting to reconne ...

  6. 分解uber依赖注入库dig-源码分析

    上一篇帖子 分解uber依赖注入库dig-使用篇 把如何使用dig进行代码示例说明,这篇帖子分析dig的源码,看他是如何实现依赖注入的. dig实现的中心思想:所有传入Provide的函数必须要有除e ...

  7. 【点分治】2019 首尔 icpc Gene Tree

    题目 链接:https://ac.nowcoder.com/acm/contest/15644/B来源:牛客网 A gene tree is a tree showing the evolution ...

  8. intellij idea的Maven项目运行报程序包找不到的错误

    概括一句话:IDEA的Terminal命令行输入mvn idea:idea或者mvn idea:module , 即可解决 重做过开发环境后在intellij idea中载入java工程,通过mave ...

  9. TypeScript 中 Optional Chaining 和 Nullish Coalescing

    Optional Chaining 解决的问题是重复且无意义的判空,之所以说无意义,是对业务来说它不是必需的,但不判空,程序直接就挂了,比如: let x = foo.bar.baz();   这里的 ...

  10. [bug] org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

    问题 原因不明,按参考文章中的做法,加了空格,clean后解决 参考 http://www.qishunwang.net/news_show_7922.aspx https://www.cnblogs ...