概述
#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 的定时器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复