C++メッセージ配信モジュールフレームワークの構想 3672 ワード C_C++ メッセージ配信にはいくつかの方法がある: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_; }; deviseの導入 JAvaでのStack使用