boost::threadpool 调用类成员变量并传入参数 的方法
2013-07-10 15:41
344 查看
1. 首先到官网下载
http://threadpool.sourceforge.net/
2. 包含头文件
[align=left]#include "../boost/threadpool.hpp"[/align][align=left]
[/align][align=left]
[/align][align=left]
[/align][align=left]3. 声明threadpool对象, [/align][align=left]
[/align][align=left]boost::threadpool::fifo_pool m_poolCmdProcess;[/align][align=left]
[/align][align=left]上面声明了一个FIFO线程池, 即先进先出[/align][align=left]
[/align][align=left]4. 声明一个Runnable适配类 来包装你的类及成员函数[/align][align=left]
[/align][align=left] class Runnable[/align][align=left] {[/align][align=left] typedef boost::function<void (/*CCommunicationMap*, */ICommandContextEx*)> function;[/align][align=left]
[/align][align=left] private:[/align][align=left] function _f;[/align][align=left] CCommunicationMap* _target;[/align][align=left] ICommandContextEx* _data;[/align][align=left]
[/align][align=left] public:[/align][align=left] template<class F>[/align][align=left] Runnable(CCommunicationMap* target, F f, ICommandContextEx* data)[/align][align=left] {[/align][align=left] _f = f;[/align][align=left] _target = target;[/align][align=left] _data = data;[/align][align=left] }[/align][align=left]
[/align][align=left] ~Runnable(){}[/align][align=left]
[/align][align=left] void run()[/align][align=left] {[/align][align=left] //_target->TestCommand(_data);[/align][align=left] _f(/*_target, */_data);[/align][align=left] }[/align][align=left] };[/align][align=left] [/align][align=left]
[/align][align=left]上面 function 声明了一个函数模板, 此模板应该和你要关联的类成员函数类型一致。[/align][align=left]
[/align][align=left]5. 调用threadpool的schedule方法 启动线程[/align][align=left]
[/align][align=left]
[/align][align=left]
[/align] boost::function<void (/*CCommunicationMap*, */ICommandContextEx*)> fun;[align=left] fun = boost::bind(&CCommunicationMap::TestCommand, &m_communication, _1);[/align][align=left]
[/align][align=left] Runnable* run = new Runnable(&m_communication, fun, pContext);[/align][align=left]
[/align][align=left] boost::threadpool::schedule(m_poolCmdProcess, boost::shared_ptr<Runnable>(run));[/align][align=left]
[/align][align=left]
[/align][align=left]注意: [/align][align=left]threadpool库中的pool_adaptors.hpp头文件有错误, 需要我们改动源码(注释的为原来代码,下面的为改动后的代码), 具体为:[/align][align=left] template<typename Pool, typename Runnable>[/align][align=left] bool schedule(Pool& pool, shared_ptr<Runnable> const & obj)[/align][align=left] { [/align][align=left] //return pool->schedule(bind(&Runnable::run, obj));[/align][align=left] return pool.schedule(bind(&Runnable::run, obj));[/align][align=left] } [/align][align=left]
[/align][align=left]
[/align]本文出自 “木子纵横” 博客,请务必保留此出处http://muzizongheng.blog.51cto.com/856912/1333069
http://threadpool.sourceforge.net/
2. 包含头文件
[align=left]#include "../boost/threadpool.hpp"[/align][align=left]
[/align][align=left]
[/align][align=left]
[/align][align=left]3. 声明threadpool对象, [/align][align=left]
[/align][align=left]boost::threadpool::fifo_pool m_poolCmdProcess;[/align][align=left]
[/align][align=left]上面声明了一个FIFO线程池, 即先进先出[/align][align=left]
[/align][align=left]4. 声明一个Runnable适配类 来包装你的类及成员函数[/align][align=left]
[/align][align=left] class Runnable[/align][align=left] {[/align][align=left] typedef boost::function<void (/*CCommunicationMap*, */ICommandContextEx*)> function;[/align][align=left]
[/align][align=left] private:[/align][align=left] function _f;[/align][align=left] CCommunicationMap* _target;[/align][align=left] ICommandContextEx* _data;[/align][align=left]
[/align][align=left] public:[/align][align=left] template<class F>[/align][align=left] Runnable(CCommunicationMap* target, F f, ICommandContextEx* data)[/align][align=left] {[/align][align=left] _f = f;[/align][align=left] _target = target;[/align][align=left] _data = data;[/align][align=left] }[/align][align=left]
[/align][align=left] ~Runnable(){}[/align][align=left]
[/align][align=left] void run()[/align][align=left] {[/align][align=left] //_target->TestCommand(_data);[/align][align=left] _f(/*_target, */_data);[/align][align=left] }[/align][align=left] };[/align][align=left] [/align][align=left]
[/align][align=left]上面 function 声明了一个函数模板, 此模板应该和你要关联的类成员函数类型一致。[/align][align=left]
[/align][align=left]5. 调用threadpool的schedule方法 启动线程[/align][align=left]
[/align][align=left]
[/align][align=left]
[/align] boost::function<void (/*CCommunicationMap*, */ICommandContextEx*)> fun;[align=left] fun = boost::bind(&CCommunicationMap::TestCommand, &m_communication, _1);[/align][align=left]
[/align][align=left] Runnable* run = new Runnable(&m_communication, fun, pContext);[/align][align=left]
[/align][align=left] boost::threadpool::schedule(m_poolCmdProcess, boost::shared_ptr<Runnable>(run));[/align][align=left]
[/align][align=left]
[/align][align=left]注意: [/align][align=left]threadpool库中的pool_adaptors.hpp头文件有错误, 需要我们改动源码(注释的为原来代码,下面的为改动后的代码), 具体为:[/align][align=left] template<typename Pool, typename Runnable>[/align][align=left] bool schedule(Pool& pool, shared_ptr<Runnable> const & obj)[/align][align=left] { [/align][align=left] //return pool->schedule(bind(&Runnable::run, obj));[/align][align=left] return pool.schedule(bind(&Runnable::run, obj));[/align][align=left] } [/align][align=left]
[/align][align=left]
[/align]本文出自 “木子纵横” 博客,请务必保留此出处http://muzizongheng.blog.51cto.com/856912/1333069
相关文章推荐
- boost::threadpool 调用类成员变量并传入参数 的方法
- boost::threadpool 调用类成员变量并传入参数 的方法
- 方法传入参数(来自成员变量),在方法中修改参数,退出方法后,是否会改变参数值呢?
- 方法传入参数(来自成员变量),在方法中修改参数,退出方法后,是否会改变参数值呢?
- 方法传入参数(来自成员变量),在方法中修改参数,退出方法后,是否会改变参数值呢?
- java,成员变量与方法参数或自定义的局部变量同名要用this,system.out.println(this)用法,
- Java基础篇笔记(四) ---this的用法,解决类中的成员变量和方法中的参数重名
- boost在lambda表达式中调用占位符参数的成员函数的方法
- Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用
- CreateRemoteThread函数多参数传入使用方法
- Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用
- 类的非静态成员函数做boost::thread参数
- C++11 thread编程调用类方法并传入参数
- gcc向待编译源文件传入参数的方法
- 封装带参数的Oracle ExecuteNonQuery 方法,用OracleParameterCollection传入参数!
- shell中调用R语言并传入参数的两种方法
- java继承中成员变量和方法调用的区别
- 编写一个学生类Students,该类成员变量包括学号no、姓名name、性别sex和年龄age,该类的成员方法有genNo()getName ). * getSex().getAge().和setA
- 父子实例的内存控制--继承成员变量和继承方法的区别
- mysql 存储过程中 limit之后使用分页变量,传入分页参数. 类似于微博游标分批次获取信息;问号参数类似于c#的string.format;问号占位符