使用事件循环

来源:互联网 发布:淘宝联盟怎么合并付款 编辑:程序博客网 时间:2024/06/08 02:08
一 、运行循环
一旦我们创建了一个已经注册了事件的event_base。接着就需要libevent等待并提醒事件。
#define EVLOOP_ONCE             0x01 //等到事件被触发,然后运行活跃事件,直到没有事件需要运行则退出。#define EVLOOP_NONBLOCK         0x02  //不等到事件被触发,只检查使用有事件要触发,并执行回调。#define EVLOOP_NO_EXIT_ON_EMPTY 0x04 //一直执行循环,直到调用event_base_loopbreak(), event_base_loopexit(),或者出现错误int event_base_loop(struct event_base *base, int flags);
默认情况下,event_base_loop运行event_base直到不再有注册的事件。重复检查释放有注册的事件被触发。一旦有事件触发,它把事件标记为活跃状态并开始运行事件。
正常结束退出返回0,出现无法处理的错误返回-1,如果不再有事件则返回1、
int event_base_dispatch(struct event_base *base);
该函数与event_base_loop相似,它会一直循环直到没有事件或调用event_base_loopbreak(), event_base_loopexit()
二 、结束循环
int event_base_loopexit(struct event_base *base, conststruct timeval *tv);int event_base_loopbreak(struct event_base *base);
event_base_loopexit在给定的时间之后结束循环,如果tv为NULL,则立即结束循环,如果event_base正在执行回调函数,则等到所有回调都结束后退出。
event_base_loopbreak()立即退出循环。与event_base_loopexit(base, NULL) 不同
int event_base_got_exit(struct event_base *base);int event_base_got_break(struct event_base *base);
这两个用于获得事件循环的退出是调用event_base_loopexit() 或 event_base_break().
三、重检查事件
int event_base_loopcontinue(struct event_base *);
通常libevent检查事件,然后以最高的优先级运行活跃的事件,然后再又一次检查事件。有时我们需要libevent停止调用回调,转去检查事件。
如果当前不在执行回调函数,event_base_loopcontinue()将不起任何作用。
四、检查内部缓存时间
int event_base_gettimeofday_cached(struct event_base *base,struct timeval *tv_out);
在回调函数内,有时候我们需要当前时间的近似值而不想调用gettimeofday()。就可以调用该函数。当event_base执行回调的时候就会设置tv_out参数。不然就会调用evutil_gettimeofday()获取当前事件。函数成功返回0,失败则返回负值。
因为是回调开始时就进行缓存,所以时间会有误差,如果回调执行比较久,则误差会比较大。如果想刷新缓存,可以用以下函数
int event_base_update_cache_time(struct event_base *base);
函数成功则返回0,失败返回-1.如果base不执行事件循环,函数不起作用。
五、保存event_base状态
void event_base_dump_events(struct event_base *base, FILE *f);
当需要调试时,我们就需要event_base以及事件的状态。

六、在event_base的每个event执行某个函数
typedefint (*event_base_foreach_event_cb)(conststruct event_base *,    conststruct 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以继续迭代,返回其他整数则停止迭代。不管回调函数返回什么值,最终都会被
event_base_foreach_event()返回。回调函数不能修改收到的事件,也不能向event_base添加或删除事件。执行
event_base_foreach_event()时,event_base会上锁,所有回调不要执行太久。








0 0
原创粉丝点击