尽管这个库的名字乍一看好象有点误导,但实际上并不是如此。 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事件处理的更多相关文章

  1. boost第 4 章 事件处理

    http://zh.highscore.de/cpp/boost/ 1.信号 Signals 2.一旦对象 被销毁,连接就会自动释放. 让 FF类继承自 boost::signals::trackab ...

  2. boost库:事件处理

    boost库的signal所实现的模式被命名为信号至插槽,当对应的信号被发出时,相关联的插槽即被执行. #include <boost/signal.hpp> #include <i ...

  3. 使用Boost asio实现异步的TCP/IP通信

    可以先了解一下Boost asio基本概念,以下是Boost asio实现的异步TCP/IP通信: 服务器: #include "stdafx.h" #include <io ...

  4. boost------asio库的使用1(Boost程序库完全开发指南)读书笔记

    asio库基于操作系统提供的异步机制,采用前摄器设计模式(Proactor)实现了可移植的异步(或者同步)IO操作,而且并不要求多线程和锁定,有效地避免了多线程编程带来的诸多有害副作用. 目前asio ...

  5. boost::asio译文

        Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENS ...

  6. [Boost基础]并发编程——asio网络库——同步socket处理

    网络通信简述 asio库支持TCP,UDP和ICMP通信协议,它在名字空间boost::asio::ip里提供了大量的网络通信方面的函数和类,很好的封装了原始的Berkeley Socket API, ...

  7. [Boost基础]并发编程——asio网络库——定时器deadline_timer

    asio库基于操作系统提供的异步机制,采用前摄器设计模式(Proactor)实现了可移植的异步(或者同步)IO操作,而且并不要求使用多线程和锁定,有些的避免了多线程编程带来的诸多有害副作用(如条件竞争 ...

  8. boost------signals2的使用1(Boost程序库完全开发指南)读书笔记

    signals2基于Boost的另一个库signals,实现了线程安全的观察者模式.在signals2库中,观察者模式被称为信号/插槽(signals and slots),他是一种函数回调机制,一个 ...

  9. Boost.Asio技术文档

    Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...

随机推荐

  1. MFC消息映射的原理:笔记

    多态的实现机制有两种,一是通过查找绝对位置表,二是查找名称表:两者各有优缺点,那么为什么mfc的消息映射采用了第二种方法,而不是c++使用的第一种呢?因为在mfc的gui类库是一个庞大的继承体系,而里 ...

  2. perl 异步请求和JS对比

    perl 异步和js对比: /js************** $(function(){ function isPhone(str){ var regex = /[0-9]{11,11}/; ret ...

  3. win32多线程程序设计笔记(第二章)

    第二章线程的第一次接触,主要讲了如何创建线程以及需要注意的几点. 一.创建线程 与调用函数的过程类似;线程只不过用CreateThread的API将函数封装起来,并产生一个与主程序同时执行的程序来调用 ...

  4. Dnasp计算LD

    Dnasp计算LD Table of Contents 1 Dnasp 计算LD 1 Dnasp 计算LD Dnasp有很多的功能,现在主要来记录其计算LD的功能. 首先File——然后打开data— ...

  5. 摘要算法CRC8、CRC16、CRC32,MD2 、MD4、MD5,SHA1、SHA256、SHA384、SHA512,RIPEMD、PANAMA、TIGER、ADLER32

    1.CRC8.CRC16.CRC32 CRC(Cyclic Redundancy Check,循环冗余校验)算法出现时间较长,应用也十分广泛,尤其是通讯领域,现在应用最多的就是 CRC32 算法,它产 ...

  6. 《Java程序代理器》- java桌面程序运行的前端启动框架

    虽说让java直接在桌面运行,有很多方法,但最简单的还是有个exe双击执行 要java执行就得有虚拟机,但原本的虚拟机文件体积太大,不方便随同打包,精简的虚拟机功能又不全,指不定什么时候报错 所以正规 ...

  7. IE 加速插件之 Google Chrome Frame

    前言 IE 8 及以下版本的速度较慢. 特别是前端的js 和 css 内容较多时尤为突出. 就笔者的开发经验来说GWT, Ext JS, raphael , draw2d 等开发的系统在IE下使用是相 ...

  8. Web工程师的工具箱 | 酷壳 - CoolShell.cn

    Web工程师的工具箱 | 酷壳 - CoolShell.cn Web工程师的工具箱 2012年12月19日 陈皓 发表评论 阅读评论 30,168 人阅读     本文出自Ivan Zuzak 的&l ...

  9. 2014/08/23——OJ出现waiting...

    问题: 今天中午,裴主解决OJ他缓慢的问题后,开着.我跟着oj他递给发现了一个话题waiting该..... 和全哥.均觉得測评程序挂了.于是重新启动測系统,还waiting.....(測评系统的进程 ...

  10. hdu1330(递推)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1330 分析:经典问题,n 块相同的木板重叠,最多能够伸出桌面多远 对于n张卡片的最佳摆法,我们只需要在 ...