boost事件处理

http://blog.csdn.net/shudaqi2010/article/details/25762529

 

boost事件处理

分类: C++ Boost   472人阅读  评论(1)  收藏  举报
c++

虽然这个库的名字乍一看好象有点误导,但实际上并非如此。 Boost.Signals 所实现的模式被命名为 '信号至插槽' (signal to slot),它基于以下概念:当对应的信号被发出时,相关联的插槽即被执行。 原则上,你可以把单词 '信号' 和 '插槽' 分别替换为 '事件' 和 '事件处理器'。 不过,由于信号可以在任意给定的时间发出,所以这一概念放弃了 '事件' 的名字。

因此,Boost.Signals 没有提供任何类似于 '事件' 的类。 相反,它提供了一个名为 boost::signal 的类,定义于boost/signal.hpp. 实际上,这个头文件是唯一一个需要知道的,因为它会自动包含其它相关的头文件。

Boost.Signals 定义了其它一些类,位于 boost::signals 名字空间中。 由于boost::signal 是最常被用到的类,所以它是位于名字空间boost 中的。

  1. void func()  
  2. {  
  3.     std::cout<<"Hello World!"<<std::endl;  
  4. }  
  5.   
  6.   
  7. int main()  
  8. {  
  9.     signals2::signal <void()> s;  
  10.     s.connect(func);  
  11.     s();  
  12.     return 0;  
  13. }  


boost::signal 实际上被实现为一个模板函数,具有被用作为事件处理器的函数的签名,该签名也是它的模板参数。 在这个例子中,只有签名为void () 的函数可以被成功关联至信号s

函数 func() 被通过 connect() 方法关联至信号s。 由于func() 符合所要求的 void () 签名,所以该关联成功建立。因此当信号s 被触发时,func() 将被调用。

信号是通过调用 s 来触发的,就象普通的函数调用那样。 这个函数的签名对应于作为模板参数传入的签名:因为 void ()不要求任何参数,所以括号内是空的。

调用 s 会引发一个触发器,进而执行相应的 func() 函数 - 之前用connect() 关联了的。


  1. int func1()  
  2. {  
  3.     std::cout<<"func1"<<std::endl;  
  4.     return 1;  
  5. }  
  6.   
  7. int func2()  
  8. {  
  9.     std::cout<<"func2"<<std::endl;  
  10.     return 2;  
  11. }  
  12.   
  13. int main()  
  14. {  
  15.     boost::signals2::signal<int ()> s;  
  16.     s.connect(func1);  
  17.     s.connect(func2);  
  18.     std::cout<<s()<<std::endl;  
  19.     return 0;  
  20. }  



编译后输出:

func1
func2
1

func1() 和 func2() 都具有int 类型的返回值。s 将处理两个返回值,并将它们都写出至标准输出流。 那么,到底会发生什么呢?

以上例子实际上会把 1写出至标准输出流。 两个返回值都被 s 正确接收,但除了第一个值,其它值都会被忽略。 缺省情况下,所有被关联函数中,实际上只有第一个返回值被返回。


signal模拟程序:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值