基于libevent 的定时器

这段代码展示了如何使用C++封装libevent库创建一个`EventWatcher`类,用于处理事件基类,并特别实现了`TimedEventWatcher`子类来定时触发回调函数。在`TimedEventWatcher`中,`HandlerFn`是事件触发时执行的回调方法,它调用传递的处理函数。应用程序部分创建了一个`TimedEventWatcher`实例,设置超时时间并启动事件监控。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "event.h"
#include <sys/time.h>

class EventWatcher {
public:
    typedef std::function<void()> Handler;
    EventWatcher(struct event_base *event_base, const Handler& handler);
    virtual ~EventWatcher();
    bool Init();
    bool Watch(const struct timeval *timeout = NULL);
    void Cancel();
    void Close();
    virtual void DoClose() {}
private:
    struct event_base *event_base_;
protected:
    virtual bool DoInit() = 0;
    struct event event_;
    Handler handler_;
};

class TimedEventWatcher : public EventWatcher {
public:
    TimedEventWatcher(struct event_base *event_base,
            const Handler& handler);
private:
    virtual bool DoInit();
    static void HandlerFn(int fd, short which, void *v);
};

源码:

EventWatcher::EventWatcher(struct event_base *event_base,
        const Handler& handler)
    : event_base_(event_base)
    , handler_(handler)
{
    assert(event_base_);
    memset(&event_, 0, sizeof(event_));
}

EventWatcher::~EventWatcher() {
    //Close();
}

bool EventWatcher::Init() {
    if (!DoInit()) {
        return false;
    }
    event_base_set(event_base_, &event_);
    return true;
}

bool EventWatcher::Watch(const struct timeval *timeout) {
    if (event_add(&event_, timeout) != 0) {
        return false;
    }
    return true;
}

void EventWatcher::Cancel() {
    if (event_initialized(&event_))
    event_del(&event_);
}

void EventWatcher::Close() {
    Cancel();
    DoClose();
}

TimedEventWatcher::TimedEventWatcher(struct event_base *event_base,
        const Handler& handler)
    : EventWatcher(event_base, handler)
{
}

bool TimedEventWatcher::DoInit() {
    evtimer_set(&event_, TimedEventWatcher::HandlerFn, this);
    return true;
}

void TimedEventWatcher::HandlerFn(int fd, short which, void *v) {
    TimedEventWatcher *h = (TimedEventWatcher*)v;
    h->handler_();
}

应用:

int ms_ = 300;
struct timeval tm;
tm.tv_sec  = ms_ / 1000;
tm.tv_usec = ms_ % 1000 * 1000;
    
TimedEventWatcher  *timer = NULL;
timer =  new cloud_dispatcher::TimedEventWatcher(ctx->base,
            std::bind(TimeOutFunction, *arg));
timer->Init();
timer->Watch(&tm);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值