通过了003 的分析, 已经完成了最重要的事件类型,下面来看一下TimerEventWatcher
这类事件。
class EVPP_EXPORT TimerEventWatcher : public EventWatcher {
public:
TimerEventWatcher(EventLoop* loop, const Handler& handler, Duration timeout);
TimerEventWatcher(EventLoop* loop, Handler&& handler, Duration timeout);
TimerEventWatcher(struct event_base* loop, const Handler& handler, Duration timeout);
TimerEventWatcher(struct event_base* loop, Handler&& handler, Duration timeout);
bool AsyncWait();
private:
virtual bool DoInit();
static void HandlerFn(evpp_socket_t fd, short which, void* v);
private:
Duration timeout_;
};
这个TimerEventWatcher
声明了4个构造函数,都是为了初始化父类里的protected
的成员变量和自己的成员变量。
TimerEventWatcher::TimerEventWatcher(EventLoop* loop,
const Handler& handler,
Duration timeout)
: EventWatcher(loop->event_base(), handler)
, timeout_(timeout) {}
TimerEventWatcher::TimerEventWatcher(EventLoop* loop,
Handler&& h,
Duration timeout)
: EventWatcher(loop->event_base(), std::move(h))
, timeout_(timeout) {}
TimerEventWatcher::TimerEventWatcher(struct event_base* loop,
const Handler& handler,
Duration timeout)
: EventWatcher(loop, handler)
, timeout_(timeout) {}
TimerEventWatcher::TimerEventWatcher(struct event_base* loop,
Handler&& h,
Duration timeout)
: EventWatcher(loop, std::move(h))
, timeout_(timeout) {}
bool TimerEventWatcher::DoInit() {
::event_set(event_, -1, 0, TimerEventWatcher::HandlerFn, this);
return true;
}
#define evtimer_set(ev, cb, arg) event_set((ev), -1, 0, (cb), (arg))
重写父类的虚函数, DoInit()
将事件类型设置成timer
类型,这儿看不出任何的迹象说是timer
类型,但是仔细看头文件中的宏定义,发现确实是设置一个timer
的时间类型。回调函数 cb = TimerEventWatcher::HandlerFn
和 arg=this
。
void TimerEventWatcher::HandlerFn(evpp_socket_t /*fd*/, short /*which*/, void* v) {
TimerEventWatcher* h = (TimerEventWatcher*)v;
h->handler_();
}
将附加参数 v
指针强制转换成TimerEventWatcher
指针h
, 调用h
内部事前已经赋值好的hanler_
。
bool TimerEventWatcher::AsyncWait() {
return Watch(timeout_);
}
AsyncWait
内部调用了父类的方法Watch
,将此类事件安装到evbase_
上。
总结:
在构造函数中,完成对成员变量的初始化, 尤其重要的是timeout_
的初始化。 在DoInit
函数中初始化时间类型为timer
类型, AsyncWait
将事件安装到evbase_
上。