我是靠谱客的博主 美满棒棒糖,最近开发中收集的这篇文章主要介绍基于libevent 的定时器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

#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);


最后

以上就是美满棒棒糖为你收集整理的基于libevent 的定时器的全部内容,希望文章能够帮你解决基于libevent 的定时器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部