BOOST::Signals2

  1. /*
  2. Andy is going to hold a concert while the time is not decided.
  3. Eric is a fans of Andy who doesn‘t want to miss this concert.
  4. Andy doesn‘t know Eric.
  5. How can Eric gets the news when Andy‘s concert is going to take?
  6. */
  7. /*
  8. Singer:被观察者
  9. Fans:观察者
  10. */
  11. #include "stdafx.h"
  12. #include <iostream>
  13. #include <boost/signals2.hpp>
  14. #include <boost/bind.hpp>
  15. #include <string>
  16. using namespace std;
  17. struct Singer
  18. {
  19. //定义信号的类型,也就是说 Singer 需要知道 Fans 的响应方式
  20. //也就是说 Singer 需要知道 Fans 会采用什么样的方式来响应 Singer 所发出的信号
  21. //或者说 Singer 需要知道 Fans 用什么样的方式来接受 Singer 发出的信号
  22. //就相当于 Singer 需要知道 Fans的“邮箱”,到时候才可以将信息投递到 Fans 的“邮箱”类型中去
  23. //Fans 的“邮箱”类型—— void (string time)
  24. typedef boost::signals2::signal<void (string time)> signalType;
  25. typedef signalType::slot_type slotType;
  26. signalType m_signal; //定义一个信号
  27. //Singer 发布信号
  28. void PublishTime(string time)
  29. {
  30. m_signal(time); //将包含 time 信息的信号m_signal投递到 Fans 的邮箱中去,注意,投递之前这种类型的邮箱必须要和一个具体的Fans联系起来,即必须知道是谁拥有这种类型的邮箱,这一动作通过后边的Subscribe实现。
  31. }
  32. //Singer 提供一种注册渠道:Fans们可以通过这个渠道来进行注册,告诉Singer,有新信号的话就发送给我一个消息
  33. boost::signals2::connection Subscribe(const slotType& fans)
  34. {//在这里将Fans与Singer建立起一种联系(connection)
  35. //到后面可以发现,Fans需要调用这个函数,即通过这个渠道告诉Singer有消息就要通知给我
  36. return m_signal.connect(fans);
  37. }
  38. };
  39. struct Fans
  40. {
  41. // m_connection:联系的存在是在整个Fans的生命周期内的,一旦Fans消失,这种联系也就不复存在了
  42. boost::signals2::scoped_connection m_connection;
  43. //Fans的响应方式,也就是Fans的邮箱类型,至于里面具体做什么事情,Singer不需要知道。
  44. void Correspond(string time)
  45. {
  46. cout<<"I know the concert time: "<<time<<endl;
  47. }
  48. //Fans需要自己确定他要关注(观察)哪一个Singer 的动向
  49. void Watch(Singer& singer)
  50. {
  51. //通过调用Singer的Subscribe函数(渠道)来将自己的邮箱地址告知Singer
  52. m_connection = singer.Subscribe(boost::bind(&Fans::Correspond, this, _1));
  53. }
  54. };
  55. int main(int argc, char* argv[])
  56. {
  57. Singer  Andy; //刘德华
  58. Fans    Eric; //Eric
  59. Eric.Watch(Andy); //Eric告知刘德华:我要关注你的动向,请把你的最新信息发给我
  60. Andy.PublishTime("2010/10/01");//刘德华发布最新信息,一旦信息发布,Eric的邮箱——void Correspond(string time)就会接受到信息,并进行响应——cout<<….
  61. return 0;
  62. }

Reference:

http://www.cppprog.com/boost_doc/doc/html/signals2/tutorial.html

http://www.cppprog.com/2009/0430/111.html

http://www.cppprog.com/boost_doc/

时间: 2024-10-11 01:03:12

BOOST::Signals2的相关文章

vs2013 boost signals

#include "stdafx.h" #include <boost/signals2/signal.hpp> #include <iostream> using namespace std; void func() { std::cout << "Hello, world!" << std::endl; } void slots1() { cout << "slots1 call"

观察者模式与Boost.Signals

1)  观察者模式定义 略,各种设计模式的书上都有定义. 2)  观察者模式一般实现 观察者模式一般实现,都是“被观察者”保存一个“观察者”的列表,循环这个列表来通知“观察者”.代码,其中使用了boost的智能指针shared_ptr: [cpp] view plaincopy #include <iostream> #include <list> #include "boost/shared_ptr.hpp" using namespace std; usin

boost与MFC的冲突(new)

在MFC对话框程序中用boost::signals2时出现了问题, 由于MFC为了方便调试,在debug下重新定义了new #ifdef _DEBUG#define new DEBUG_NEW#endif 因此与boost产生了冲突 我的解决方法是把boost的头文件放在stdafx.h中其它MFC头文件的上面. boost与MFC的冲突(new),布布扣,bubuko.com

boost signal2 slot_base

先看成员_tracked_objects,从字面上讲是被跟踪的对象,再看,相关函数 bool expired() const,这个函数是检查_tracked_objects是否已经expired.只不过是使用一些设计模式上的东西,理解也比较好理解, if(apply_visitor(detail::expired_weak_ptr_visitor(), *it)) return true; 实质也就是将*it传入detail::expired_weak_ptr_visitor(),其实就是调用仿

boost事件处理

尽管这个库的名字乍一看好象有点误导,但实际上并不是如此. Boost.Signals 所实现的模式被命名为 '信号至插槽' (signal to slot).它基于下面概念:当相应的信号被发出时.相关联的插槽即被运行. 原则上,你能够把单词 '信号' 和 '插槽' 分别替换为 '事件' 和 '事件处理器'. 只是,因为信号能够在随意给定的时间发出.所以这一概念放弃了 '事件' 的名字. 因此.Boost.Signals 没有提供不论什么类似于 '事件' 的类. 相反,它提供了一个名为 boost

boost::signals::signal的使用方法

吃力的讲完boost::signals的ppt.然后接着就是做练习题. 通过讲ppt,发现有一句话说的真好:你自己知道是一回事.你能给别人讲明确又是另外一回事.真的有些东西你自己理解,可是用语言去非常难表达,是不是用语言难以表达暴露出自己对所理解的东西不是真正的理解?... . orz.只是讲完ppt之后,真的对boost::singals的理解又加深一层.好了废话不多说了,如今来看两个习题(ppt的内容基本上是boost官方站点介绍boost::singlas使用方法的章节,这里不贴了): 第

Boost signal 代码示例

网上介绍Boost signal原理的文章很多,这里不介绍原理,仅贴一些示例代码,这在初步接触Boost signal时能够有个较好的感性认识,深入了解需要去体会挖掘boost源码.代码基本上来自Boost turioal,其中有一些错误会导致编译不过,这里都做了更正: 1. 基本运用 #include <boost/signals2.hpp> #include <boost/bind.hpp> #include <iostream> using namespace s

boost::signals::signal的用法

吃力的讲完boost::signals的ppt,然后接着就是做练习题.通过讲ppt,发现有一句话说的真好:你自己知道是一回事,你能给别人讲明白又是另外一回事.真的有些东西你自己理解,但是用语言去很难表达,是不是用语言难以表达暴露出自己对所理解的东西不是真正的理解?....orz,不过讲完ppt之后,真的对boost::singals的理解又加深一层.好了废话不多说了,现在来看两个习题(ppt的内容基本上是boost官方网站介绍boost::singlas用法的章节,这里不贴了): 第一题: 题目

boost--signal

1.signals2库 signals2库实现了线程安全的观察者模式,在signals2中观察者模式被称为信号/插槽(signals/slots),它是一种函数回调机制.一个信号可以关联一个或多个插槽,当信号发出时,所有关联它的插槽都会被调用. signals2位于名字空间boost::signals2,使用需要包含头文件"boost/signals2.hpp",而且在VC下编译signals2时,应该在stdafx.h中加入预声明#define _SCL_SECURE_NO_WARN