004 - event_watcher.h 和 event_watcher.cc (续 TimerEventWatcher)

通过了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::HandlerFnarg=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_上。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容