Timer定时器开发
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定时器开发的更多相关文章
- .net中 Timer定时器
作者:feiying008 在开发一套视觉系统时,发现系统内存一直不断增加,直至系统内存爆满.一开始还以为是程序内存泄露,是图像操作算法写的有问题,但是,发现如果电机轴如果 不运行的状态下,每隔一秒进 ...
- C#中WebService 的 Timer定时器过段时间后自动停止运行
我用.net做的一个Timer定时器,定时获取短信并给予回复,但大概过了十几个小时以后,Timer定时器会自动停止,再发送短信就不能收到回复,需要在服务器中重新运行定时器才可以,请教各位! 我是在.n ...
- asp.net中Timer定时器在web中无刷新的使用
最近在做一个项目的时候,web端的数据需要与数据源进行实时同步,并保证数据的准确性,当时,考虑到使用ajax异步刷新技术.但后来在网上查找相关资料时,发现这样做,太浪费资源了,因为ajax的提交请求不 ...
- JAVA Timer定时器使用方法(二)
JAVA Timer 定时器测试 MyTask.java:package com.timer; import java.text.SimpleDateFormat;import java.util. ...
- C#中Timer定时器的使用示例
关于C#中timer类 在C#里关于定时器类就有3个: 1.定义在System.Windows.Forms里 2.定义在System.Threading.Timer类里 3.定义在System.Tim ...
- [Python 多线程] Timer定时器/延迟执行、Event事件 (七)
Timer继承子Thread类,是Thread的子类,也是线程类,具有线程的能力和特征.这个类用来定义多久执行一个函数. 它的实例是能够延迟执行目标函数的线程,在真正执行目标函数之前,都可以cance ...
- 浅析linux内核中timer定时器的生成和sofirq软中断调用流程(转自http://blog.chinaunix.net/uid-20564848-id-73480.html)
浅析linux内核中timer定时器的生成和sofirq软中断调用流程 mod_timer添加的定时器timer在内核的软中断中发生调用,__run_timers会spin_lock_irq(& ...
- 浅析linux内核中timer定时器的生成和sofirq软中断调用流程【转】
转自:http://blog.chinaunix.net/uid-20564848-id-73480.html 浅析linux内核中timer定时器的生成和sofirq软中断调用流程 mod_time ...
- 关于C#中Timer定时器的重入问题解决方法(也适用于多线程)
项目中用到了定时器随着服务启动作定时任务,按指定的准点时间定时执行相关操作,但是在指定准点时间内我只想让它执行一次,要避免重入问题的发生. 首先简单介绍一下timer,这里所说的timer是指的Sys ...
随机推荐
- 硬盘分区形式(MBR、GPT)、系统引导、文件系统、Inode和Block
目录 MBR和GPT MBR的局限性 GPT的优势 主分区.扩展分区和逻辑分区 挂接卷 Legacy.UEFI引导和GRUB引导 文件系统(FAT16.32.NTFS和EXT2.3.4.Xfs.Tmp ...
- POJ 2135 简单费用流
题意: 题意是一个人他要从牧场1走到牧场n然后在走回来,每条路径只走一次,问全程的最短路径是多少. 思路: 这个题目挺简单的吧,首先要保证每条边只能走一次,然后还要要求费用最 ...
- Linux中正则表达式和字符串的查询、替换(tr/diff/wc/find)
目录 正则表达式 基本正则表达式 扩展正则表达式 grep tr diff du wc find 正则表达式 正则表达式,又称正规表示法.常规表示法( Regular Expression,在代码中常 ...
- Windows Pe 第三章 PE头文件(下)
3.5 数据结构字段详解 3.5.1 PE头IMAGE_NT_HEADER的字段 1.IMAGE_NT_HEADER.Signature +0000h,双字.PE文件标识,被定义为00004550 ...
- Debuggee not connected 寒江孤钓<<windows 内核安全编程>> 学习笔记
双机联调出现的问题 真机系统win7 虚拟机系统xp 安装书中的配置一步一步走,发现最后启动系统后,windbg一直显示 Opened \\.\pipe\com_1Waiting to reconne ...
- 分解uber依赖注入库dig-源码分析
上一篇帖子 分解uber依赖注入库dig-使用篇 把如何使用dig进行代码示例说明,这篇帖子分析dig的源码,看他是如何实现依赖注入的. dig实现的中心思想:所有传入Provide的函数必须要有除e ...
- 【点分治】2019 首尔 icpc Gene Tree
题目 链接:https://ac.nowcoder.com/acm/contest/15644/B来源:牛客网 A gene tree is a tree showing the evolution ...
- intellij idea的Maven项目运行报程序包找不到的错误
概括一句话:IDEA的Terminal命令行输入mvn idea:idea或者mvn idea:module , 即可解决 重做过开发环境后在intellij idea中载入java工程,通过mave ...
- TypeScript 中 Optional Chaining 和 Nullish Coalescing
Optional Chaining 解决的问题是重复且无意义的判空,之所以说无意义,是对业务来说它不是必需的,但不判空,程序直接就挂了,比如: let x = foo.bar.baz(); 这里的 ...
- [bug] org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
问题 原因不明,按参考文章中的做法,加了空格,clean后解决 参考 http://www.qishunwang.net/news_show_7922.aspx https://www.cnblogs ...