boost事件处理
盡管這個庫的名字乍一看好象有點誤導,但實際上并不是如此。 Boost.Signals 所實現的模式被命名為 '信號至插槽' (signal to slot)。它基于下面概念:當相應的信號被發出時。相關聯的插槽即被運行。
原則上,你能夠把單詞 '信號' 和 '插槽' 分別替換為 '事件' 和 '事件處理器'。 只是,因為信號能夠在隨意給定的時間發出。所以這一概念放棄了 '事件' 的名字。
因此。Boost.Signals 沒有提供不論什么類似于 '事件' 的類。
相反,它提供了一個名為 boost::signal 的類,定義于boost/signal.hpp. 實際上,這個頭文件是唯一一個須要知道的,由于它會自己主動包括其他相關的頭文件。
Boost.Signals 定義了其他一些類。位于 boost::signals 名字空間中。 因為boost::signal 是最常被用到的類,所以它是位于名字空間boost 中的。
void func()
{
std::cout<<"Hello World!"<<std::endl;
} int main()
{
signals2::signal <void()> s;
s.connect(func);
s();
return 0;
}
boost::signal 實際上被實現為一個模板函數。具有被用作為事件處理器的函數的簽名,該簽名也是它的模板參數。 在這個樣例中。僅僅有簽名為void () 的函數能夠被成功關聯至信號s。
函數 func() 被通過 connect() 方法關聯至信號s。 因為func() 符合所要求的
void () 簽名,所以該關聯成功建立。因此當信號s 被觸發時,func() 將被調用。
信號是通過調用 s 來觸發的,就象普通的函數調用那樣。 這個函數的簽名相應于作為模板參數傳入的簽名:由于 不要求不論什么參數,所以括號內是空的。
void ()
調用 s 會引發一個觸發器,進而運行對應的 func() 函數 - 之前用connect() 關聯了的。
int func1()
{
std::cout<<"func1"<<std::endl;
return 1;
} int func2()
{
std::cout<<"func2"<<std::endl;
return 2;
} int main()
{
boost::signals2::signal<int ()> s;
s.connect(func1);
s.connect(func2);
std::cout<<s()<<std::endl;
return 0;
}
編譯后輸出:
func1
func2
1
func1() 和 func2() 都具有int 類型的返回值。
s 將處理兩個返回值,并將它們都寫出至標準輸出流。 那么,究竟會發生什么呢?
以上樣例實際上會把 1寫出至標準輸出流。 兩個返回值都被 s 正確接收。但除了第一個值。其他值都會被忽略。 缺省情況下,全部被關聯函數中。實際上僅僅有第一個返回值被返回。
signal模擬程序:
- class Buttion
- {
- public:
- void connect(void (*f)(int, int));
- void OnBtnClick();
- private:
- void (*fuc_)(int, int);
- };
- void Buttion::connect(void (*f)(int, int))
- {
- fuc_ = f;
- }
- void Buttion::OnBtnClick()
- {
- fuc_(10, 20);
- }
- void PrintCodeline(int x, int y)
- {
- cout<<"x:"<<x<<",y:"<<y<<endl;
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- Buttion btn;
- btn.connect(&PrintCodeline);
- btn.OnBtnClick();
- getchar();
- return 0;
- }
總結
- 上一篇: 戴安液相色谱仪是一种现代化的高性能分析工
- 下一篇: 2018-8-10-VisualStud