有 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 function
void 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/