日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

boost事件处理

發布時間:2023/12/18 编程问答 24 如意码农
生活随笔 收集整理的這篇文章主要介紹了 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模擬程序:

  1. class Buttion
  2. {
  3. public:
  4. void connect(void (*f)(int, int));
  5. void OnBtnClick();
  6. private:
  7. void (*fuc_)(int, int);
  8. };
  9. void Buttion::connect(void (*f)(int, int))
  10. {
  11. fuc_ = f;
  12. }
  13. void Buttion::OnBtnClick()
  14. {
  15. fuc_(10, 20);
  16. }
  17. void PrintCodeline(int x, int y)
  18. {
  19. cout<<"x:"<<x<<",y:"<<y<<endl;
  20. }
  21. int _tmain(int argc, _TCHAR* argv[])
  22. {
  23. Buttion btn;
  24. btn.connect(&PrintCodeline);
  25. btn.OnBtnClick();
  26. getchar();
  27. return 0;
  28. }

總結

以上是生活随笔為你收集整理的boost事件处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。