Libevent 定时器
先摘一点网上的介绍
libevent是一个事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。著名分布式缓存软件memcached也是libevent based,而且libevent在使用上可以做到跨平台,而且根据libevent官方网站上公布的数据统计,似乎也有着非凡的性能。
接着我们先直接看一个例子,该例子每隔几秒输出一个句子
#include <iostream>
#include <event.h>
#include <ctime> using namespace std; void cb(evutil_socket_t fd, short what, void *arg)
{
cout<<"event ocurrence every 2 seconds."<<endl;
} int main()
{
timeval two_sec = {, };
event_base *base = event_base_new();
event *timeout = event_new(base, -, EV_PERSIST|EV_TIMEOUT, cb, NULL);
event_add(timeout, &two_sec);
event_base_dispatch(base);
return ;
}
event_base是libevent中的基本数据结构,该结构进行事件的调度,这里用event_config_new (void)函数new了一个event_base变量。event结构libevent里另外一个重要的数据结构,它保存着有关事件发生的各种信息,比如io事件的文件描述符,发生时调用的回调函数等。本例中我们定义了一个定时器事件,使用event_new (event_base *, evutil_socket_t, short, event_callback_fn, void *)创建了一个定时器事件,该函数第一个参数为调度该事件的event_base结构;第二个参数为io事件对应的文件描述符,这里为定时器事件没有fd所以定位-1,如果要定义signal事件,该参数就是信号的标志;第三个参数为事件event flags,可以以下几个及其合并EV_READ(io),EV_WRITE(io),EV_SIGNAL(信号),EV_PERSIST(存在该标志则事件发生后event_base将其重新添加到pending中),EV_ET, EV_TIMEOUT,根据程序要求选用EV_PERSIST|EV_TIMEOUT,就是重复定时。libevent中的事件有几种状态:no-pend&no-active,pending,active;刚刚建立的event为第一种状态,使用event_add(event*, time_val)将其变成pending状态,这样event_base进行事件调度时才会执行该事件,该函数第二参数为timeout时间,这里取2s。最后将进行event_base事件循环,event_base_dispatch。
使用libevent进行网络编程的话大概也就是这个流程。
Libevent 定时器的更多相关文章
- libevent 定时器示例
程序执行结果: 每隔2秒,触发一次定时器. (2)98行:evtimer_assign在event.h中定义如下: 再来看看event_assign函数: ev 要初始化的事件对象 base ...
- libevent 定时器timer
libevent是一个基于事件触发的网络库,memcached底层也是使用libevent库. 总体来说,libevent有下面一些特点和优势:* 事件驱动,高性能:* 轻量级,专注于网络: * 跨平 ...
- libevent中定时器的使用方法
#include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <signal.h ...
- libevent(一)定时器Demo
开始研究libevent,使用的版本是2.0.22. 实现一个定时器:每2秒执行一次printf. #include <stdio.h> #include <stdlib.h> ...
- 定时器管理:nginx的红黑树和libevent的堆
libevent 发生超时后, while循环一次从堆顶del timer——直到最新调整的最小堆顶不是超时事件为止,(实际是del event),但是会稍后把这个timeout的 event放到ac ...
- 利用libevent的timer实现定时器interval
在不怎么了解libevent的情况下,看到timer这个关键字想到可以用来做定时任务,官方资料也不齐全,就从代码里看到了TIMEOUT字样,这么说来应该是支持timeout了,那interval呢,貌 ...
- libevent::事件::定时器2
#define evtimer_new(b, cb, arg) event_new((b), -1, 0, (cb), (arg)) #include <cstdio> #include ...
- libevent::事件::定时器
#include <cstdio> #include <errno.h> #include <sys/types.h> #include <event.h&g ...
- [译]libev和libevent的设计差异
本文译自what's the difference between libev and libevent? 作者是libev作者 [问]两个库都是为异步io调度而设计,在Linux上都是使用epoll ...
随机推荐
- Spark随笔(一):Spark的综合认识
一.Spark与Hadoop的关系 Spark和Hadoop只是共用了底层的MapReduce编程模型,即它们均是基于MapReduce思想所开发的分布式数据处理系统. Hadoop采用MapRedu ...
- QUICK START GUIDE
QUICK START GUIDE This page is a guide aimed at helping anyone set up a cheap radio scanner based on ...
- 实时刷新Winform中Label的Text
最直白的例子: private void btnStart_Click(object sender, EventArgs e) { ; ) { labelTime.Text = i.ToString( ...
- PHP中常用的函数
1.php 字符串截取函数 2.php取得当前时间函数 3.php 字符串长度函数 4.几种php 删除数组元素方法 5.php中var_dump()函数的详解说明 6.PHP preg_match正 ...
- 【Avalon】factory
(function(global, factory) { if (typeof module === "object" && typeof module.expor ...
- systemtap折腾笔记
在这货上花费了不少时间,都是受了@agentzh 大神的蛊惑:) 他写的nginx-systemtap-toolkit监测的数据很有价值,对于系统优化实在是利器. 最早折腾systemtap,是在Ub ...
- [转]设置Android手机以使用ARM Streamline进行性能分析(二)
原文因为arm社区改版访问不到了,原作者鲍方,原文地址,这篇是从google cache里挖出来的,希望能帮到要对cocos2dx优化的各位 Posted by Fang Bao, Leave C ...
- 图数据库(graph database)资料收集和解析 - daily
Motivation 图数据库中的高科技和高安全性中引用了一个关于图数据库(graph database)的应用前景的乐观估计: 预计到2017年,图数据库产业在数据库市场的份额将从2个百分点增长到2 ...
- 我用工具怎么连接不上mysql数据库的? MySql access denied for user错误
MySql access denied for user错误 方法/步骤 MySql远程连接时的"access denied for user **@**"错误,搞的我很头大, ...
- python学习之路(一)屌丝逆袭之路
变量 ...