Message Bus

Message Bus


版權聲明:本文為 cheng-zhi 原創文章,可以隨意轉載,但必須在明確位置注明出處!

什么是 C++11 消息總線 ?

最近在 C++ 項目中需要處理對象之間大量的消息,如果使用傳統的 SendMessagePostMessage 會使得對象之間的耦合程度過高,因此我們最后采用了一個基于 C++11消息總線庫 Message Bus,它有下面的一些優點:

  1. 使用簡單,發送和接收只需要一條語句,并使用 lambda 來簡化函數的回調
  2. 可以使得模塊之間高度解偶,這依賴于一個全局的 MessageBus 對象
  3. 支持發送自定義消息或者數據包
  4. 支持發送有參和無參消息

基本原理

你可以將 Message Bus 理解為一個全局的消息通道,你可以將自己的加上標識字的消息放到這個通道上,別的模塊就可以通過這個標識字來拿到你的消息,這些都依賴與一個全局對象 MessageBus g_bus,它就充當了全局消息通道。

基本使用方法

發送和接受無參消息

發送:

// g_bus 是一個全局變量
extern MessageBus g_bus;

// 發送一個帶有 `InitAll` 標識字的無參數消息
g_bus.SendReq<void>("InitAll");

接收:

// g_bus 是一個全局變量
extern MessageBus g_bus;

// 綁定帶有 `InitAll` 標識字的消息,一般在構造函數中進行.
// 一收到消息,InitAll 函數就會被調用,使用了簡單粗暴 lambda 表達式
g_bus.Attach([this](){ InitAll(); }, "InitAll");

// 解除綁定帶有 `InitAll` 的消息,一般在析構函數中進行
g_bus.Remove<void>("InitAll");

發送和接受有參消息

發送:

// g_bus 是一個全局變量
extern MessageBus g_bus;

YourType m_yourType;
// 發送一個帶有 `YourType` 類型參數的有參消息
g_bus.SendReq<void, const YourType&>(m_yourType, "YourType");

接收:

// g_bus 是一個全局變量
extern MessageBus g_bus;

// 綁定帶有 `YourType` 標識字的有參消息,一般在構造函數中進行.
// 一收到消息,you_function 就會被調用,并且發送時候傳遞的 `m_yourtype` 參數傳遞到這里的 `your_type`,最終傳遞到 `you_function`,是不是非常簡單。
g_bus.Attach([this](const YourType& your_type){ you_function(your_type); }, "YourType");

// 解除綁定 `YourType` 標識的消息,一般在析構函數中進行
g_bus.Remove<void, const YourType&>("YourType");

原文地址

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,933評論 18 139
  • 進程間使用D-Bus通信 D-Bus是一種高級的進程間通信機制,它由freedesktop.org項目提供,使用G...
    WB莫遙燚閱讀 22,059評論 0 7
  • 國家電網公司企業標準(Q/GDW)- 面向對象的用電信息數據交換協議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,150評論 6 13
  • 姓名:周崇杰 學號:16040120059 專業:機械設計制造及其自動化 轉載自:http://blog.cs...
    CJbaby閱讀 2,922評論 0 5
  • 本該振興家業令種族得以世代延續下去,這是他的責任,可他偏偏愛上了人類,成了背叛狼人家族的叛徒過起離群索居的生活。...
    籬樵閱讀 217評論 0 0