Qt 和 Boost關於信號和槽的對比說明


對比 安全

不管是 Qt 的實現方式仍是 Boost 的實現方式,除了必須的定義信號和槽的類以外,都不須要額外的類。 框架

兩種實現都解決了類爆炸的問題。下面讓咱們對照着來看一下咱們前面的分析。 異步

  • 兩個不一樣的術語以及各自的動做:信號和槽函數

  • 在一個地方(信號)能夠鏈接零個或者多個回調函數(槽)同時也是多對多的,一對多,多對多工具

  • 焦點在於鏈接自己,而不是提供者或者消費者;開發工具

  • 不須要手工爲了一個鏈接建立新的類spa

  • 鏈接仍舊是類型安全的線程

這五點是信號槽系統的核心,Qt 和 boost 都擁有這些特性。 設計

 

下面則是兩者的不一樣之處:code

Boost.Signals Qt Signals 和 Slots
信號 一個信號就是一個對象
全局的、局部的或者是成員對象
信號只能是成員函數
調用 發出信號相似於函數調用
任何可以訪問到信號對象的代碼均可以發出信號
發出信號相似於函數調用
Qt 提供了一個 emit 關鍵字來完成這個操做
只有信號的擁有者才能發出信號
槽是任何可被調用的函數或者函數對象 槽是通過特別設計的成員函數
返回值 能夠有返回值?,返回值能夠在多個槽中使用 沒有返回值
同步異步 同步 同步或(直連)者異步(隊列)
線程安全 非線程安全? 線程安全,能夠跨線程使用
信號斷開 當且僅當槽是可追蹤的時候?,槽被銷燬時,鏈接自動斷開 槽被銷燬時,鏈接都會自動斷開(由於全部槽都是可追蹤的)
類型安全 類型安全(編譯器檢查) 類型安全(運行期檢查)
參數列表 參數列表必須徹底一致 槽能夠忽略信號中多餘的參數(信號的參數能夠比槽多)
信號、槽能夠是模板 信號、槽不能是模板
底層實現 C++ 直接實現 經過由 moc 生成的元對象實現(moc 以及元對象系統都是 C++ 直接實現的)
內省 沒有內省機制 能夠經過內省發現

能夠經過元對象調用

鏈接能夠從資源文件中自動推斷出

?都是有疑問的地方。目前還未理解

最重要的是,Qt 的信號槽機制已經深深地植入到框架之中,成爲不可分割的一部分。它們可使用 Qt 專門的開發工具,例如 QtCreator,經過拖拽的方式很輕鬆的建立、刪除、修改。它們甚至能夠經過動態加載資源文件,由特定命名的對象自動動態生成。這些都是 boost 做爲一個通用庫所不可能提供的。

 

-----------------------------------------------------------------------------------------------------------------------------------

 

轉帖地址:http://no001.blog.51cto.com/1142339/1335733/

相關文章
相關標籤/搜索