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. }
时间: 2024-08-02 19:12:12

boost事件处理的相关文章

C/C++利用Boost::Asio网络库建立自己的Socket服务器

引言 寸光阴,当下我们或许更需要利用现有的知识,应用现有的技术.网络是当前互联网的根本,了解网络便开始显得极其重要.今天我们利用Boost库中Asio部分,浅尝网络服务器.此处不做过于深入的开展,为达成学习目的,只做简单的异步并发服务器. 注意:本篇代码没有直接引用boost等命名空间,为的是新入门Boost的同学能够更好的了解每个参数在boost的具体命名空间位置,有助于更好的理解boost的布局. 版权所有:_OE_,转载请注明出处:http://blog.csdn.net/csnd_ayo

Boost.Asio技术文档

Christopher Kohlhoff Copyright ? 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_0.txt文件或从http://www.boost.org/LICENSE_1_0.txt) Boost.Asio是用于网络和低层IO编程的跨平台C++库,为开发者提供了C++环境下稳定的异步模型. 综述 基本原理 应用程序与外界交互的方式有很多,可通过文件,网络,串口或控制台.例如在网络通信中,完

boost::asio译文

Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_0.txt文件或从http://www.boost.org/LICENSE_1_0.txt) Boost.Asio是用于网络和低层IO编程的跨平台C++库,为开发者提供了C++环境下稳定的异步模型. 综述 基本原理 应用程序与外界交互的方式有很多,可通过文件,网络,串口或控制台.例如在网络通信中,完

Boost.Asio c++ 网络编程翻译(11)

*_at方法 这些方法在一个流上面做随机存取操作.你来指定read和write操作从什么地方開始(offset): async_read_at(stream, offset, buffer [, completion], handler):这种方法在一个指定的流上从offset处開始运行一个异步的read操作,当操作结束时,他会调用handler. handler的格式为:void handler(const boost::system::error_code&  err, size_t byt

两种高效的事件处理模式(Proactor和Reactor)

典型的多线程服务器的线程模型 1. 每个请求创建一个线程,使用阻塞式 I/O 操作 这是最简单的线程模型,1个线程处理1个连接的全部生命周期.该模型的优点在于:这个模型足够简单,它可以实现复杂的业务场景,同时,线程个数是可以远大于CPU个数的.然而,线程个数又不是可以无限增大的,为什么呢?因为线程什么时候执行是由操作系统内核调度算法决定的,调度算法并不会考虑某个线程可能只是为了一个连接服务的,时间片到了就执行一下,哪怕这个线程一执行就会不得不继续睡眠.这样来回的唤醒.睡眠线程在次数不多的情况下,

Boost.Asio基本原理(CSDN也有Markdown了,好开森)

Boost.Asio基本原理 这一章涵盖了在使用Boost.Asio时必须知道的一些事情.我们也将深入研究比同步编程更复杂.更有乐趣的异步编程. 网络API 这一部分包含了当使用Boost.Asio编写网络应用程序时必须知道的事情. Boost.Asio命名空间 Boost.Asio的所有内容都包含在boost::asio命名空间或者其子命名空间内. * boost::asio:这是核心类和函数所在的地方.重要的类有io_service和streambuf.类似read, read_at, re

boost::asio基本使用

一.Asio网络库 截止到C++17,C++标准库都没有加入网络通信库.实际项目网络编程是非常常见的功能,直接使用操作系统API是低效率且不稳定的,比较好的方法是借助第三方成熟可靠的网络库.据我所知C++中目前比较有名的网络库有ACE.libevent和boost.Asio,这三个库都是跨平台的,各有特色,对于一般的应用来说,使用这些库都是没什么问题.由于C++标准库和boost库的亲缘关系,我经常使用boost中其它的库,所以选择了Asio库.在网络上搜索了大家对Asio的评价,发现Asio库

mac下编译 boost编译工具b2

cd boost_1_64_0/tools/build ./bootstrap.sh --with-toolset=gcc 输出: -n Bootstrapping the build engine with toolset gcc... engine/bin.macosxx86_64/b2 Bootstrapping is done. To build and install, run: ./b2 install --prefix=<DIR> ./b2 install --prefix=/u

第三十八课、Qt中的事件处理(上)

一.图形界面应用程序的消息处理模型 二.Qt的事件处理 1.Qt平台将系统产生的消息转换为Qt事件(每一个系统消息对象Qt平台的一个事件) (1).Qt事件是一个QEvent的对象 (2).Qt事件用于描述程序内部或者外部发生的动作 (3).任意的QObject对象都具备事件处理的能力 2.GUI应用程序的事件处理方式 (1).Qt事件产生后立即被分发到QWidget对象 (2).QWidget中的event(QEvent*)进行事件处理 (3).event()根据事件类型调用不同的事件处理函数