上一篇文章讲了Reactor模式的关键结构I/O复用和事件分发,现在我们来关注一下它们的使用。
事件循环
我们已经实现了一个Epoller类来实现I/O复用,具体的使用方法就是Epoller::Poll()函数等待事件的发生,该函数有一个超时时间,超过这个时间即使没有事件发生也会返回,那么我们如何让它一直工作呢?很明显就是使用while循环。
一个事件循环的大概逻辑如上图,就是循环反复地调用Poll(),现在我们抽象出一个类Looper来管理这个循环。
下面是部分Looper的代码,在这个类中我们持有唯一的一个Epoller指针,通过AddEventBase()等函数往Epoller上注册或修改事件,注意,我们传入的事件是经过包装后的EventBase类,里面已经有了事件处理函数了。我们可以通过Start()开始事件循环,所有的处理都在该循环内完成。
class Looper
{
public:
Looper();
~Looper();
// 开始事件循环
void Start();
// 注册事件
void AddEventBase(std::shared_ptr<EventBase> eventbase