鱼C论坛

 找回密码
 立即注册
查看: 2580|回复: 1

[技术交流] 《C++Boost库asio》第二篇 为回调函数增加更多的参数

[复制链接]
发表于 2017-7-9 11:12:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
怎么为回调函数增加更多的参数:
默认的只有一个const boost::system::error_code &,告诉函数出不出错,怎么样增加更充足的上下

文环境

1.bind的形式(不推荐)2.lamba(推荐)
#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

void print(const boost::system::error_code &, boost::asio::deadline_timer *t, int *count)

{
if(*count < 5) {
  std::cout << *count <<std::endl;
  ++(*count);

  t->expires_at(t->expires_at() + boost::posix_time::seconds(1));//重新指定一个下一次失效

的时间,t->expires_at()当前的失效时间,然后加上1秒钟,再调用这个函数之后,还有1秒钟的失效

时间还会调用它
  t->async_wait( boost::bind(print, boost::asio::placeholders::error, t, count));
//boost::bind返回一个boost::function<>
//async_wait((传入的是一个模板参数,只要是可调用的都可以))
//boost::asio::placeholders::error只是占了个位置,没有值
}
}

int main() {
boost::asio::io_service io;//我们的程序和操作系统底层之间的一个相互传递的枢纽,会把事件

按照一定方式进行处理;
int count = 0;
// 每秒钟调用一次,以异步的方式
boost::asio::deadline_timer t(io, boost::posix_time::seconds(1));
//boost::function<void(const boost::system::error_code&)>
t.async_wait( boost::bind(print, boost::asio::placeholders::error, &t, &count));
//现在写法:
//t.async_wait([&t, &count](const auto& error) {
// print(error, &t, &count);
//});//(const auto& error)这个写法要在C++14编译才支持
io.run();

std::cout << "Final count is " << count << std::endl;
}

注意:asio调用回调的时候,回调过程中所绑定的参数的生命周期就非常的重要

评分

参与人数 1鱼币 +4 收起 理由
小甲鱼 + 4 热爱鱼C^_^

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-7-10 10:48:36 | 显示全部楼层
上一篇讲到了异步

提到异步就要讲到回调函数了

回调函数的大概意思是:在此刻执行代码的时候并不马上调用你的代码,而是在完成某个条件后才调用,比如你设定了在1秒后才调用,或者在用户点击了按钮后才调用。(具体的意思可以百度,我又偷懒了

怎么为回调函数增加更多的参数?

默认的只有一个const boost::system::error_code & 参数,告诉函数出不出错

怎么样增加更充足的上下文环境?

为大家介绍2种方式,为回调函数增加更多的参数:

1. bind(旧,不推荐)


  1. // 每隔一秒打印一次count的值,打印结果是 0 1 2 3 4
  2. #include <iostream>
  3. #include <boost\asio.hpp>
  4. #include <boost\bind.hpp>
  5. #include <boost\date_time\posix_time\posix_time.hpp>

  6. // 回调函数,1秒调1次
  7. void print(const boost::system::error_code &, boost::asio::deadline_timer *t, int *count)
  8. {
  9.         if (*count < 5)
  10.         {
  11.                 std::cout << *count << std::endl;
  12.                 ++(*count);

  13.                 //重新指定一个下一次失效的时间,t->expires_at()当前的失效时间,然后加上1秒钟,再调用这个函数之后,还有1秒钟的失效时间还会调用它
  14.                 t->expires_at(t->expires_at() + boost::posix_time::seconds(1));
  15.                
  16.                 //boost::bind返回一个boost::function<>
  17.                 //async_wait((传入的是一个模板参数,只要是可调用的都可以))
  18.                 //boost::asio::placeholders::error只是占了个位置,没有值
  19.                 t->async_wait(boost::bind(print, boost::asio::placeholders::error, t, count));

  20.         }
  21. }

  22. int main()
  23. {
  24.         // 我们的程序和操作系统底层之间的一个相互传递的枢纽
  25.         // 会把事件按照一定方式进行处理;
  26.         boost::asio::io_service io;

  27.         int count = 0;
  28.        
  29.         // 每秒钟调用一次,以异步的方式
  30.         boost::asio::deadline_timer t(io, boost::posix_time::seconds(1));

  31.         t.async_wait(boost::bind(print, boost::asio::placeholders::error, &t, &count));

  32.         // 开始运行;
  33.         io.run();

  34.         std::cout << "mian finish run \n" << std::endl;// 提示下main函数已经结束了
  35.         system("pause");// 让VS控制台程序不会一闪而过;
  36.     return 0;
  37. }
复制代码


2. lambda (推荐)


  1. // 每隔一秒打印一次count的值,打印结果是 0 1 2 3 4
  2. #include <iostream>
  3. #include <boost\asio.hpp>
  4. #include <boost\bind.hpp>
  5. #include <boost\date_time\posix_time\posix_time.hpp>

  6. // 回调函数,1秒调1次
  7. void print(const boost::system::error_code &error, boost::asio::deadline_timer *t, int *count)
  8. {
  9.         if (*count < 5)
  10.         {
  11.                 std::cout << *count << std::endl;
  12.                 ++(*count);

  13.                 //重新指定一个下一次失效的时间,t->expires_at()当前的失效时间,
  14.                 //然后加上1秒钟,再调用这个函数之后,还有1秒钟的失效时间还会调用它
  15.                 t->expires_at(t->expires_at() + boost::posix_time::seconds(1));
  16.                
  17.                 //boost::bind返回一个boost::function<>
  18.                 //async_wait((传入的是一个模板参数,只要是可调用的都可以))
  19.                 //boost::asio::placeholders::error只是占了个位置,没有值
  20.                 t->async_wait([t, count](const boost::system::error_code &error) {
  21.                         print(error, t, count);
  22.                 });

  23.         }
  24. }

  25. int main()
  26. {
  27.         // 我们的程序和操作系统底层之间的一个相互传递的枢纽
  28.         // 会把事件按照一定方式进行处理;
  29.         boost::asio::io_service io;

  30.         int count = 0;
  31.        
  32.         // 每秒钟调用一次,以异步的方式
  33.         boost::asio::deadline_timer t(io, boost::posix_time::seconds(1));

  34.         t.async_wait([&t, &count](const auto& error) {
  35.                 print(error, &t, &count);
  36.         });

  37.         // 开始运行;
  38.         io.run();

  39.         std::cout << "mian finish run \n" << std::endl;// 提示下main函数已经结束了
  40.         system("pause");// 让VS控制台程序不会一闪而过;
  41.     return 0;
  42. }
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 11:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表