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;
    };
    
    
  • 相关阅读:
    Linux Shell脚本编程实用技巧
    Transmission在Pandorabox(Openwrt)下的交叉编译
    Pandorabox下关于vsftpd匿名访问的设置
    PandoraBox下部署阿里云(aliyun)DDNS动态域名更新(shell脚本)
    win7系统封装小记
    CF R#295 (DIV.2) E. Pluses everywhere
    CF R#295 (DIV.2) D. Cubes
    CF R#295 (DIV.2) C. DNA Alignment
    winform在线操作office--dsoframerocx第三方控件
    Dapper操作
  • 原文地址:https://www.cnblogs.com/xl-cnblog/p/14819713.html
Copyright © 2011-2022 走看看