zoukankan      html  css  js  c++  java
  • libevent学习-reactor设计模式及代码示例


    title: libevent学习-reactor设计模式及代码示例
    date: 2021-01-22 11:39:35
    tags: libevent
    categories: libevent学习

    Reactor Design Pattern

    Reactor设计模式包含句柄(Handle)、Reactor、事件多路分发器(EventDemultiplexer)、事件处理器(EventHandler)和具体事件处理器(ConcreteEventHandler)
    (1)Handle
    (2)Reactor
    (3)EventDemultiplexer
    (4)EventHandler
    (5)ConcreteEventHandler
    

    Example

    typedef unsigned int event_t;
    typedef unsigned int Handle;
    
    class EventHandler
    {
    public:
        virtual void handle_event(int event) = 0;
        virtual Handle get_handle() = 0;
        // ...
    };
    
    class ConcreteEventHandler : public EventHandler
    {
    public:
        virtual void handle_event(int event){}
        virtual Handle get_handle()
        {
            return handle;
        }
    
    private:
        Handle handle;
    };
    
    class EventDemultiplexer
    {
    public:
        void register_event(Handle, event_t){}
        void remove_event(Handle){}
        void demultiplex(std::map<Handle, EventHandler*> *)
        {
        	// wait for event
            // wait block OK and handle ready
        }
    };
    
    class Reactor
    {
    public:
        int register_handler(EventHandler *pHandler, event_t event)
        {
        	Handle handle = pHandler->get_handle();
        	// if it is new handle, save it to mapHandleEventHandler
        	std::map<Handle, EventHandler*>::iterator it = this->mapHandleEventHandler.find(handle);
        	if (it != this->mapHandleEventHandler.end())
        	{
        		this->mapHandleEventHandler[handle] = pHandler;
        	}
            // call EventDemultiplexer register_event
            eventDemultiplexer.register_event(handle, event);
        }
    
        int remove_handler(EventHandler *pHandler, event_t event)
        {
        	handle_t handle = handler->GetHandle();
            m_handlers.erase(handle);
            eventDemultiplexer.remove_event(handle);
        }
    
        void handle_events(timeval *ptv)
        {
            // eventloop waiting event and call EventHandler callback function(handle_event)
            eventDemultiplexer.demultiplex(&mapHandleEventHandler);
            // call ConcreteEventHandler handle_event()
        }
    
    private:
        EventDemultiplexer eventDemultiplexer;
        std::map<Handle, EventHandler*> mapHandleEventHandler;
    };
    
    
  • 相关阅读:
    固定sql语句传参批量查询数据库脚本
    超多行数据纵向编辑
    takes 3 positional arguments but 4 were given错误
    使用PMD进行代码审查(转)
    WebADI应用到Office 2016 64-bit
    SVN 提交代码时强制加入注释内容
    DOCKER初体验
    "make_path" is not exported by the File::Path modul
    perl 调用shell脚本
    scp 上传文件到多个服务器节点
  • 原文地址:https://www.cnblogs.com/xl-cnblog/p/14819713.html
Copyright © 2011-2022 走看看