C++メッセージ配信モジュールフレームワークの構想

3672 ワード

メッセージ配信にはいくつかの方法がある:1、メッセージコールバック関数の使用2、インタフェースの暴露、各モジュールにこのモジュール3、メッセージ構造体の統一または約束フォーマットを継承させ、その後、各独立モジュールは通信モジュールを採用してインタラクションする
以下は配布の初歩的な構想で、未経験証です.
#pragma once
#include 
#include 
#include 
#include 
#include 
#include 
/*
*              ui   
*                  |
*                  |
*                  |
*             service   (dispatcher    )-----db    
*                  |
*                  |
*                  |
*              core    
*
*/

struct msg_param_t
{
    std::string  id;
    std::string  sender;
    std::string  receiver;
    std::string  body;
    void*        rsv;
};

typedef std::string msg_name_t;
typedef std::string msg_body_t;


//!    ,T       ,  msg   T         handle  
//           R         ,        (     )
template
class msg_dispatcher_t
{
    typedef R                                  rcv_ptr_t;                              //!       
    typedef std::string                        json_value_t;                           //!      
    typedef int (msg_dispatcher_t::*reg_func_t)(const json_value_t&, rcv_ptr_t); //!          
    typedef std::map<:string reg_func_t="">  reg_func_queue_t;                       //!     
public:
    //!                 
    msg_dispatcher_t(T& _msg_handler) : m_msg_handler_(_msg_handler){
        m_reg_func_[m_msg_handler_.msg_name()] = &_msg_handler.handle;
    }

    //!     ,         dispatch,        msg_handler   handle  
    //json body      
    int dispath(const json_value_t& _json, rcv_ptr_t _rcv){
        reg_func_queue_t::const_iterator it = m_reg_func_.find(_json);
        if (it != m_reg_func_.end())
        {
            reg_func_t func = it->second;
            //(this->*func)(/*json*/, _rcv);
            //   ,    
        } 
    }
private:
    T&                      m_msg_handler_;
    reg_func_queue_t        m_reg_func_;
};

//        (     )
class msg_handler_t
{
public:
    typedef int rcv_ptr_t;

public:
    void handle(const msg_param_t& _param,  rcv_ptr_t _rcv){ 
        std::cout << "msg_handle" << std::endl; 
    }
    std::string msg_name() { return "msg_name_test"; }
};

//           ,        (      )
class msg_dispatcher_factory_t{
public:
    //            
    bool register_msg_handle();

    //           
    template
    msg_dispatcher_t find_msg_handle(const msg_name_t& _msg_name);

protected:
    msg_dispatcher_factory_t();
    ~msg_dispatcher_factory_t();

private:
    //                  ,    
};


//         ,       ,           
class msg_dispatcher_impl_t{
public:
    explicit msg_dispatcher_impl_t(msg_dispatcher_factory_t* _factory){
        run_loop();
    }

    //      ,        ,      
    void push_msg(msg_param_t _msg){
        //  ,      
    }

    //    ,       
    bool run_loop(){
        //Sleep(200);
        //            (   ),      
        msg_param_t  param = m_msg_queue_.front();
        //                  , id          ,       
        //msg_dispatcher_t dispatcher = m_dispatcher_factory_->find_msg_handle(param.id);
        //                ,          
        //dispatcher.dispath(param.body, param.receiver);
    }
private:

private:
    msg_dispatcher_factory_t*  m_dispatcher_factory_;  //       ,          
    boost::thread*             m_thread_;
    boost::mutex               m_mtx_;
    std::list     m_msg_queue_;
};