第七章 事件循环

来源:互联网 发布: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相关联且激活的或已决的。提供的回调将精确的引发在每个事件上,每个事件一次(没有特别的顺序)。

0 0
原创粉丝点击