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 合成器,如果一个信号连接多个参函数,可以定义一个集合,收集各个函数的返回值
- 信号的管理
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;
}