文档章节

Libevent学习——定时器基本运用

mickelfeng
 mickelfeng
发布于 2017/08/17 18:16
字数 897
阅读 92
收藏 0

3.1、首先初始化libevent库,并保存返回的指针

struct event_base *base = event_base_new();

这一步相当于初始化一个Reactor实例;在初始化libevent后,就可以注册事件了。

3.2、定义两个结构体,分别代表事件和定时器值

struct event timeout;//定时器事件
struct timeval tv;//定时器值

3.3、将事件和event_base绑定

event_assign(&timeout, base, -1, flags, timeout_cb, (void*)&timeout);

flags参数代表了事件标志。

#define EV_TIMEOUT 0x01//这个标志表示某超时时间流逝后事件成为激活的。构造事件的时候,EV_TIMEOUT标志是被忽略的:可以在添加事件的时候设置超时,也可以不设置。超时发生时,回调函数的what参数将带有这个标志。
#define EV_READ 0x02//表示指定的文件描述符已经就绪,可以读取的时候,事件将成为激活的。
#define EV_WRITE 0x04//表示指定的文件描述符已经就绪,可以写入的时候,事件将成为激活的。
#define EV_SIGNAL 0x08//用于实现信号检测
#define EV_PERSIST 0x10//表示事件是“持久的”
#define EV_ET 0x20//表示如果底层的event_base后端支持边沿触发事件,则事件应该是边沿触发的。这个标志影响EV_READ和EV_WRITE的语义。

我们可以去看下event_assign函数:

int event_assign(struct event *, struct event_base *, evutil_socket_t, short,event_callback_fn, void *);

来看下各个参数:  

  @param ev an event struct to be modified//事件的结构体,也就是定时器事件timeout

  @param base the event base to which ev should be attached.//需要绑定的event_base

  @param fd the file descriptor to be monitored//需要监视文件描述符,当fd=-1时,事件被手动激活或者定时器溢出激活

  @param events desired events to monitor; can be EV_READ and/or EV_WRITE//事件的模式

  @param callback callback function to be invoked when the event occurs//回调函数,,当fd上的事件event发生时,调用该函数执行处理,它有三个参数,调用时由event_base负责传入,按顺序,实际上就是event_assign的fd, event和arg;arg:传递给cb函数指针的参数

  @param callback_arg an argument to be passed to the callback function//传给回调函数的参数

 

3.4、在创建定时器事件时,使用的是struct event timeout,也可以用event_new函数动态分配,这样就不需要event_assign函数了。

struct event *timeout;
timeout= evsignal_new(base, -1, flags, timeout_cb, (void*)&timeout);

在分配后可以用event_free来释放

3.5、添加事件

event_add(&timeout, &tv);

3.6、程序进入无限循环,等待就绪事件并执行事件处理

event_base_dispatch(base);

3.7、为使用方便,libevent提供了一些以evtimer_开头的宏,用于替代event_*调用来操作纯超时事件。使用这些宏能改进代码的清晰性。

#define evtimer_assign(ev, b, cb, arg) \
event_assign((ev), (b), -1, 0, (cb), (arg))
#define evtimer_new(b, cb, arg) event_new((b), -1, 0, (cb), (arg))
#define evtimer_add(ev, tv) event_add((ev), (tv))
#define evtimer_del(ev) event_del(ev)
#define evtimer_pending(ev, tv) event_pending((ev), EV_TIMEOUT, (tv))
#define evtimer_initialized(ev) event_initialized(ev)

3.8、程序代码

#include "stdafx.h"
#include <winsock2.h>
#include <event2/event-config.h>
#include <event2/event.h>
#include <event2/event_struct.h>
#include <event2/util.h>
static void timeout_cb(evutil_socket_t fd, short event, void *arg)
{
struct event *timeout;
timeout = (struct event *)arg;
struct timeval tv;
evutil_timerclear(&tv);
tv.tv_sec = 2;
event_add(timeout, &tv);
printf("timeout\n");
}
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsa_data;
WSAStartup(0x0201, &wsa_data);
struct event_base *base = event_base_new();
struct event timeout;//定时器事件
struct timeval tv;//定时器值
int flags = EV_TIMEOUT;
event_assign(&timeout, base, -1, flags, timeout_cb, (void*)&timeout);
evutil_timerclear(&tv);
tv.tv_sec = 2;
tv.tv_usec = 0;
event_add(&timeout, &tv);
event_base_dispatch(base);
return 0;
}

 

本文转载自:http://blog.sina.com.cn/s/blog_d8567f4f0102vzgy.html

mickelfeng

mickelfeng

粉丝 237
博文 2790
码字总数 604288
作品 0
成都
高级程序员
私信 提问
libevent源码深度剖析

作者:http://blog.csdn.net/sparkliang/article/category/660506 libevent源码深度剖析十三——libevent信号处理注意点 libevent源码深度剖析十三——libevent信号处理注意点前面讲到了lib...

晨曦之光
2012/03/09
2.7K
0
libevent源码深度剖析

原文地址:http://blog.csdn.net/sparkliang/article/details/4957667 libevent源码深度剖析一 ——序幕 张亮 1 前言 Libevent是一个轻量级的开源高性能网络库,使用者众多,研究者更甚,相关...

晨曦之光
2012/03/09
204
0
Linux下定时器的使用

Linux下应用层定时器本来有好几种,大伙可以去搜索其他帖子博客,这里我主要描述我在使用setitimer时候遇到的问题,话不多说,直接上代码吧 例子一:只有定时器任务,为模拟复杂,我特意加个...

sysu_huyh5
2016/03/31
121
0
PHP之高性能I/O框架:Libevent(一)

Libevent 是一个用C语言编写的、轻量级的开源高性能I/O框架,支持多种 I/O 多路复用技术: epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。...

飞鸿影的博客
2018/07/02
0
0
STM32学习笔记(5)——通用定时器PWM输出

1、TIMER输出PWM基本概念 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是...

葫芦娃的后桌
2018/08/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

可见性有序性,Happens-before来搞定

写在前面 上一篇文章并发 Bug 之源有三,请睁大眼睛看清它们 谈到了可见性/原子性/有序性三个问题,这些问题通常违背我们的直觉和思考模式,也就导致了很多并发 Bug 为了解决 CPU,内存,IO ...

tan日拱一兵
37分钟前
3
0
网络七层模型与TCP/UDP

为了使全球范围内不同的计算机厂家能够相互之间能够比较协调的进行通信,这个时候就有必要建立一种全球范围内的通用协议,以规范各个厂家之间的通信接口,这就是网络七层模型的由来。本文首先...

爱宝贝丶
40分钟前
4
0
Jenkins World 贡献者峰会及专家答疑展位

本文首发于:Jenkins 中文社区 原文链接 作者:Marky Jackson 译者:shunw Jenkins World 贡献者峰会及专家答疑展位 本文为 Jenkins World 贡献者峰会活动期间的记录 Jenkins 15周岁啦!Jen...

Jenkins中文社区
58分钟前
10
0
杂谈:面向微服务的体系结构评审中需要问的三个问题

面向微服务的体系结构如今风靡全球。这是因为更快的部署节奏和更低的成本是面向微服务的体系结构的基本承诺。 然而,对于大多数试水的公司来说,开发活动更多的是将现有的单块应用程序转换为...

liululee
今天
8
0
OSChina 周二乱弹 —— 我等饭呢,你是不是来错食堂了?

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @ 自行车丢了:给主编推荐首歌 《クリスマスの夜》- 岡村孝子 手机党少年们想听歌,请使劲儿戳(这里) @烽火燎原 :国庆快来,我需要长假! ...

小小编辑
今天
1K
13

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部