c++ boost库--信号处理

c++ boost库–信号处理

标签(空格分隔): c++ boost


概述

在windows编程中,每一次按键,或者数遍移动,或者其他动作都会向系统消息队列中,投递一条对应的消息,而应用程序捕捉到对应的消息后,要在消息循环中做对应的处理,例如按下键盘,要会产生WM_KEYDOWN消息,在消息循环中要对其进行处理。按下按键即为事件,而对消息进行处理的代码即为消息处理器,qt中直接将每一个事件抽象成一个信号,而事件处理函数封装成为对应的槽函数。在boost中提供了signal类,来处理上述对应的关系。
本文主要从三个方面介绍boost库中信号处理相关知识。
1. 信号及槽的使用,返回值的获取
2. 信号基槽的管理

信号及槽的应用

信号的使用分为三步
1. 定义信号,signal
在signal.hpp signal定义如下

 template<
    typename Signature, // function type R (T1, T2, ..., TN)
    typename Combiner = last_value<typename function_traits<Signature>::result_type>,
    typename Group = int,
    typename GroupCompare = std::less<Group>,
    typename SlotFunction = function<Signature>
  >
  class signal :

模板参数常用的有第一个和第二个,
Signature 函数签名,即参函数的类型
Combiner 合成器,如果一个信号连接多个参函数,可以定义一个集合,收集各个函数的返回值

  1. 信号的管理
    signal提供了如下成员方法,用来管理槽函数
disconnect()    //释放槽函数
num_slots()     //获取关联此信号槽函数的数量
empty()         //连接此信号的槽函数是否为空
disconnect_all_slots()  //释放所有连接

同时boost库提供了boost::signals2::connection来管理槽函数
其成员方法 block unblock分为一用来释放和启用槽函数,具体请看下面的用例

用例

#include "stdafx.h"
#include <iostream>
#include <boost/signals2.hpp>
#include <boost/bind.hpp>

using namespace std;
using namespace boost::signals2;

void slots1()
{
    cout<<"slots1 called"<<endl;
}

void slots2()
{
    cout<<"slots2 called"<<endl;
}

class A
{
public:
    static int staticMemberFunc(int param)
    {
        cout<<"A::staticMemberFunc called, param: "<<param<<endl;
        return 0;
    }
    int memberFunc(int param)
    {
        cout<<"A::memberFunc called, param: "<<param<<endl;
        return 0;
    }
};

int main()
{
    boost::signals2::signal<void()> sig;
    boost::signals2::signal<int(int)> sig2;

    A a;
    connection c1 = sig.connect(&slots1);
    connection c2 =sig.connect(&slots2);
    cout<<"First call-------------------"<<endl;
    sig();
    if (c2.connected())
    {
        c2.disconnect();
    }
    cout<<"Second call-------------------"<<endl;
    sig();

    connection c3 =sig2.connect(&A::staticMemberFunc);// 绑定成员函数
    connection c4 =sig2.connect(boost::bind(&A::memberFunc, &a, _1));// 绑定静态成员函数

    cout<<"Return code is: "<<*sig2(44)<<endl;// 只能返回最后被调用的插槽的返回值
    return 0;
}

//Output: 
First call-------------------
slots1 called
slots2 called
Second call-------------------
slots1 called
A::staticMemberFunc called, param: 44
A::memberFunc called, param: 44
Return code is: 0

 注意使用解引用操作符*获取的只是最后被调用的插槽的返回值,如果需要知道每个插槽函数的返回值需要使用合并器(combiner)。示例如下

#include <boost/signal.hpp> 
#include <iostream> 
#include <vector> 
#include <algorithm> 

int func1() 
{ 
  return 1; 
} 

int func2() 
{ 
  return 2; 
} 

template <typename T> 
struct min_element 
{ 
  typedef T result_type; 

  template <typename InputIterator> 
  T operator()(InputIterator first, InputIterator last) const 
  { 
    return T(first, last); 
  } 
}; 

int main() 
{ 
  boost::signal<int (), min_element<std::vector<int> > > s; 
  s.connect(func1); 
  s.connect(func2); 
  std::vector<int> v = s(); 
  std::cout << *std::min_element(v.begin(), v.end()) << std::endl; 
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值