Libevent 定时器

系统 1644 0

先摘一点网上的介绍

 

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 
      
      = {
      
        2
      
      , 
      
        0
      
      
        };

    event_base 
      
      *
      
        base
      
       =
      
         event_base_new();

    
      
      
        event
      
       *timeout = event_new(
      
        base
      
      , -
      
        1
      
      , EV_PERSIST|
      
        EV_TIMEOUT, cb, NULL);

    event_add(timeout, 
      
      &
      
        two_sec);

    event_base_dispatch(
      
      
        base
      
      
        );

    
      
      
        return
      
      
        0
      
      
        ;

}
      
    

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 定时器


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论