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;
- }
boost事件处理的更多相关文章
- boost第 4 章 事件处理
http://zh.highscore.de/cpp/boost/ 1.信号 Signals 2.一旦对象 被销毁,连接就会自动释放. 让 FF类继承自 boost::signals::trackab ...
- boost库:事件处理
boost库的signal所实现的模式被命名为信号至插槽,当对应的信号被发出时,相关联的插槽即被执行. #include <boost/signal.hpp> #include <i ...
- 使用Boost asio实现异步的TCP/IP通信
可以先了解一下Boost asio基本概念,以下是Boost asio实现的异步TCP/IP通信: 服务器: #include "stdafx.h" #include <io ...
- boost------asio库的使用1(Boost程序库完全开发指南)读书笔记
asio库基于操作系统提供的异步机制,采用前摄器设计模式(Proactor)实现了可移植的异步(或者同步)IO操作,而且并不要求多线程和锁定,有效地避免了多线程编程带来的诸多有害副作用. 目前asio ...
- boost::asio译文
Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENS ...
- [Boost基础]并发编程——asio网络库——同步socket处理
网络通信简述 asio库支持TCP,UDP和ICMP通信协议,它在名字空间boost::asio::ip里提供了大量的网络通信方面的函数和类,很好的封装了原始的Berkeley Socket API, ...
- [Boost基础]并发编程——asio网络库——定时器deadline_timer
asio库基于操作系统提供的异步机制,采用前摄器设计模式(Proactor)实现了可移植的异步(或者同步)IO操作,而且并不要求使用多线程和锁定,有些的避免了多线程编程带来的诸多有害副作用(如条件竞争 ...
- boost------signals2的使用1(Boost程序库完全开发指南)读书笔记
signals2基于Boost的另一个库signals,实现了线程安全的观察者模式.在signals2库中,观察者模式被称为信号/插槽(signals and slots),他是一种函数回调机制,一个 ...
- Boost.Asio技术文档
Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...
随机推荐
- 新建表维护程序SM30
1.先新建一个客制表 2.创建一个函数组 3.SE11中该表->实用程序->表维护生成器->权限组填写&NC& -> 函数组填写刚才创建的函数组->维护 ...
- ThinkPHP 3 的CURD管理用户信息 修改和删除
本节课大纲: 一.ThinkPHP 3 的CURD管理用户信息 http://localhost:8080/thinkphp/index.php/User/index 访问User类的index方法 ...
- Webserver管理系列:5、利用MSConfig排查木马
木马程序最喜欢去的地方有两个一个是服务里面,一个是启动里面.利用msconfig我们能够高速的找到可疑程序. 在命令行中输入msconfig回车 选择服务项: 这里面的服务有非常多我们非常难排查,我告 ...
- Linux Shell 之 Shell中的函数调用
说起函数调用,相信大家也不会陌生,然而对于初学Shell的我来说,Shell中函数调用方式却有点让我不太习惯,自己也走了不少的弯路,因为传递参数时出了一个很“自然”的错误,也让我吃了不少的苦头,所以总 ...
- cocos2d-x中使用JNI的调用JAVA方法
用cocos2d-x公布Android项目时.都应该知道要用JAVA与C/C++进行交互时会涉及到JNI的操作(Java Native Interface).JNI是JAVA的一个通用接口.旨在本地化 ...
- Java线程的生命周期(转)
Java线程的生命周期 一个线程的产生是从我们调用了start方法开始进入Runnable状态,即可以被调度运行状态,并没有真正开始运行,调度器可以将CPU分配给它,使线程进入Running状态,真正 ...
- 图像编程学习笔记1——bmp文件结构处理与显示
文本内容转载自<数字图像处理编程入门>,代码为自己实现 1.1图和调色板的概念 如今Windows(3.x以及95,98,NT)系列已经成为绝大多数用户使用的操作系统,它比DOS成功的一个 ...
- C++ STL中Map的相关排序操作:按Key排序和按Value排序 - 编程小径 - 博客频道 - CSDN.NET
C++ STL中Map的相关排序操作:按Key排序和按Value排序 - 编程小径 - 博客频道 - CSDN.NET C++ STL中Map的相关排序操作:按Key排序和按Value排序 分类: C ...
- Python性能分析指南 - 技术翻译 - 开源中国社区
http://www.oschina.net/translate/python-performance-analysis
- 安卓MP3播放器开发实例(1)之音乐列表界面
学习安卓开发有一年了,想想这一年的努力,确实也收获了不少.也找到了比較如意的工作. 今天准备分享一个以前在初学阶段练习的一个项目.通过这个项目我真正的找到了开发安卓软件的感觉,从此逐渐步入安卓开发的正 ...