第七章 事件循环
来源:互联网 发布:Linux进入根目录的命令 编辑:程序博客网 时间:2024/06/05 11:05
第七章 事件循环
7.1 运行循环
#include <event2/event.h>#define EVLOOP_ONCE 0x01#define EVLOOP_NONBLOCK 0x02#define EVLOOP_NO_EXIT_ON_EMPTY 0x04int event_base_loop(struct event_base *base,int flags);
默认情况下,event_base_loop()函数运行直到base中没有事件。
在运行的循环过程中,它不断重复的检查是否有任何注册的事件被引发。一旦发生,它将所有引发的事件标记为激活状态,并运行他们。
可以通过修改flags改变event_base_loop()的行为。如果EVLOOP_ONCE被设置,循环将等待直到有事件被激活然后运行事件,直到没有更多的事件运行,然后返回。
如果EVLOOP_NONBLOCK被设置,循环不会等待事件引发,它将仅仅检查是否有任何事件准备好立即引发,并运行他们的回调函数。
一般而言,在没有未决事件或激活事件时,循环立刻退出。可以通过EVLOOP_NO_EXIT_ON_EMPTY改变这种行为。
例如,如果从某个线程中增加事件,若设了EVLOOP_NO_EXIT_ON_EMPTY,循环将会运行直到有人调用event_base_loopbreak(),或者event_base_loopexit(),或者出现错误。
如果event_base_loop()返回0,则是正常退出,返回-1表示后台有未处理的错误,返回1表示这里没有未决的或激法的事件。
也可以使用如下调用:
int event_base_dispatch(struct event_base *base);//与没有设置任何flag的event_base_loop一样。因此,它一直运行直到没有更多的注册事件或直到调用event_base_loopbreak()或调用event_base_loopexit()。可以通过EVLOOP_NO_EXIT_ON_EMPTY改变这种行为。
停止循环
int event_base_loopexit(struct event_base *base, const struct timeval *tv);int event_base_loopbreak(struct event_base *base);注:返回0表示成功,-1表示失败
event_base_loopexit在给定的时间tv后停止循环,如果tv为NULL,立即退出。如果event_base当前正在运行激活事件的回调函数,它将继续运行他们不会退出直到他们都运行完。
event_base-loopbreak()告诉event_base它的循环马上退出。如果当前在运行一个回调函数,它们在完成这个回调后马上退出(其它激活事件的回调将不会运行)。
7.3 事件重新检查
一般来说,libevent检查事件,然后运行所有的激活事件(最高优先级),然后再次检查事件,如此循环。
但是当前回调运行后想马上停止libevent执行下个事件回调,而是去重新scan事件。可以通过调用event_base_loopcontinue(struct event_base*)实现
int event_base_loopcontinue(struct event_base *);注:如果当前没有运行事件回调,调用event_base_loopcontinue不起作用
7.4 检查内部缓存时间
int event_base_gettimeofday_cached(struct event_base *base, struct timeval *tv_out);//如果当前event_base在执行回调,则该函数设置tv_out为缓存时间,否则,它将调用evutil_gettimeofday()获取真实当前时间注:成功返回0,失败返回负数
注:因为当libevent执行回调函数时,tv_out为缓存时间,它可能有些不精确。
如果回调函数运行时间较长,它可能非常不准确,为了强制马上更新缓存时间,可以调用:
int event_base_update_cache_time(struct event_base *base);//注:成功返回0,失败返回-1.//如果base没有运行事件循环,则不起作用。
7.5 event_base状态
void event_base_dump_events(struct event_base *base,FILE *f);
为了更好的debug程序,可以需要加入event_base中的所有事件列表和它们的状态。调用event_base_dump_events()可以将其输出到标准文件中。
该列表是人要读的。
7.6 在event_base中的每个事件中运行一个函数
typedef int (*event_base_foreach_event_cb)(const struct event_base *,const struct event *,void *);int event_base_foreach_event(struct event_base *base,event_base_foreach_event_cb fn,void *arg);
可以使用event_base_foreach_event()来迭代每一个当前与event_base相关联且激活的或已决的。提供的回调将精确的引发在每个事件上,每个事件一次(没有特别的顺序)。
- 第七章 事件循环
- 第七章 循环控制
- 第七章 Spring自定义事件
- JavaScript Event学习第七章:事件属性
- 第七章 Qt事件(event)处理
- 第七周.循环大战
- 第七周—循环
- 事件循环
- 第七章 : plsql编程基础 (变量&循环&标签)
- C语言学习 第七章-循环结构(亮了)
- 第七章 第三节 for 循环控制结构
- 循环事件事件监听
- js--事件--事件循环
- js--事件--事件循环
- 第七周作业;循环大战!
- 第七周 作业循环大战
- 第七章(序)事件处理-(Event Processingn)
- 《csharp高级编程》 学习笔记 第七章 委托和事件
- Linux下安装Oracle12cR1
- LeetCode 78:Subsets
- 项目文件介绍
- C#调用C++动态库并回调C#函数
- JZWC【Day3】题解&总结
- 第七章 事件循环
- 矩阵上三角打印
- 安卓动画之listView动画,Activity切换动画,Fragment切换动画及LayoutAnimation的使用
- hdu 5612Baby Ming and Matrix games(dfs)
- 第八章 working with events
- Linux设备模型之input子系统详解(一)
- Apache服务器-使用.htaccess实现图片防盗链方法
- 第九章 Helper functions and types for Libevent
- JS——Sublime Text2怎么快速的新建一个HTML的头部