Boost 的事件管理架構:Signal / Slot(上)

来源:互联网 发布:商家给淘宝开具什么发 编辑:程序博客网 时间:2024/06/07 03:26

有 Signals2 就代表有 Signals1(官方頁面),Boost 裡的這兩個函式庫基本上要做的事情是一樣的,不同的地方在於 Signals2 是設計成 thread-safe 的,而且也做了一定程度的自動連線管理,理論上在使用上會比較方便、安全,所以 Heresy 在這邊就僅就 Signals2 來做介紹了。

概念

Signals2 這個函式庫,是採用 signals / slots 的概念(最早應該是 Qt 所提出來的,參考維基百科),來實作一個 publisher、或稱事件(event)系統,也類似所謂的「委派」(delegates)的概念,功能比一般的 callback function 強了不少。

Signals / slots 這種系統的基本概念,基本上就是每一個 signal 可以連接(connect)一個、或多個 slot,而當程式發送(emit)這個 signal 的時候,所有連接到這個 signal 的 slot,就都會被呼叫並執行。

這樣設計的好處,是在於在這些 signal 和 slot 的連結,可以在 runtime 時建立,而非寫死在程式中;所以程式在編寫時,也不必去管到底他要呼叫多少、那些東西,只要去發送 signal 就好了。而這個 signal 連結到多少 slot,在程式內部也都不需要去在乎,除了可以將程式內的模組進一步切割、減少直接使用,也算是相當有彈性的寫法。


基本使用

而 Boost 的 signals2 要怎麼使用呢?有興趣的人可以直接去看 Boost 提供的教學網頁,裡面有各種狀況下的使用方法,而在範例的頁面,也有提供了數個範例程式,可以作為參考。Heresy 在這邊,則是就 Heresy 自己覺得應該比較用的到的部分,做一些簡單的說明。

首先,先來個最簡單的範例程式:

// include STL headers#include <stdlib.h>#include <iostream> // include Boost header#include <boost/signals2/signal.hpp> // slot functionvoid slotTest1( int a ){  std::cout << "Test1 get " << a << std::endl;} void slotTest2( int a ){  std::cout << "Test2 get " << a << std::endl;} int main( int argc, char** argv ){  // create a signal  boost::signals2::signal<void (int)> mSignal1;   // connect signal and slot  mSignal1.connect( slotTest1 );  mSignal1.connect( slotTest2 );   // emit signal  mSignal1( 10 );   return 0;}

http://kheresy.wordpress.com/2011/04/07/boost_signals_part1/

原创粉丝点击