|

楼主 |
发表于 2017-7-10 10:48:36
|
显示全部楼层
上一篇讲到了异步
提到异步就要讲到回调函数了
回调函数的大概意思是:在此刻执行代码的时候并不马上调用你的代码,而是在完成某个条件后才调用,比如你设定了在1秒后才调用,或者在用户点击了按钮后才调用。(具体的意思可以百度,我又偷懒了 )
怎么为回调函数增加更多的参数?
默认的只有一个const boost::system::error_code & 参数,告诉函数出不出错
怎么样增加更充足的上下文环境?
为大家介绍2种方式,为回调函数增加更多的参数:
1. bind(旧,不推荐)
- // 每隔一秒打印一次count的值,打印结果是 0 1 2 3 4
- #include <iostream>
- #include <boost\asio.hpp>
- #include <boost\bind.hpp>
- #include <boost\date_time\posix_time\posix_time.hpp>
- // 回调函数,1秒调1次
- 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()当前的失效时间,然后加上1秒钟,再调用这个函数之后,还有1秒钟的失效时间还会调用它
- t->expires_at(t->expires_at() + boost::posix_time::seconds(1));
-
- //boost::bind返回一个boost::function<>
- //async_wait((传入的是一个模板参数,只要是可调用的都可以))
- //boost::asio::placeholders::error只是占了个位置,没有值
- t->async_wait(boost::bind(print, boost::asio::placeholders::error, t, count));
- }
- }
- int main()
- {
- // 我们的程序和操作系统底层之间的一个相互传递的枢纽
- // 会把事件按照一定方式进行处理;
- boost::asio::io_service io;
- int count = 0;
-
- // 每秒钟调用一次,以异步的方式
- boost::asio::deadline_timer t(io, boost::posix_time::seconds(1));
- t.async_wait(boost::bind(print, boost::asio::placeholders::error, &t, &count));
- // 开始运行;
- io.run();
- std::cout << "mian finish run \n" << std::endl;// 提示下main函数已经结束了
- system("pause");// 让VS控制台程序不会一闪而过;
- return 0;
- }
复制代码
2. lambda (推荐)
- // 每隔一秒打印一次count的值,打印结果是 0 1 2 3 4
- #include <iostream>
- #include <boost\asio.hpp>
- #include <boost\bind.hpp>
- #include <boost\date_time\posix_time\posix_time.hpp>
- // 回调函数,1秒调1次
- void print(const boost::system::error_code &error, boost::asio::deadline_timer *t, int *count)
- {
- if (*count < 5)
- {
- std::cout << *count << std::endl;
- ++(*count);
- //重新指定一个下一次失效的时间,t->expires_at()当前的失效时间,
- //然后加上1秒钟,再调用这个函数之后,还有1秒钟的失效时间还会调用它
- t->expires_at(t->expires_at() + boost::posix_time::seconds(1));
-
- //boost::bind返回一个boost::function<>
- //async_wait((传入的是一个模板参数,只要是可调用的都可以))
- //boost::asio::placeholders::error只是占了个位置,没有值
- t->async_wait([t, count](const boost::system::error_code &error) {
- print(error, t, count);
- });
- }
- }
- int main()
- {
- // 我们的程序和操作系统底层之间的一个相互传递的枢纽
- // 会把事件按照一定方式进行处理;
- boost::asio::io_service io;
- int count = 0;
-
- // 每秒钟调用一次,以异步的方式
- boost::asio::deadline_timer t(io, boost::posix_time::seconds(1));
- t.async_wait([&t, &count](const auto& error) {
- print(error, &t, &count);
- });
- // 开始运行;
- io.run();
- std::cout << "mian finish run \n" << std::endl;// 提示下main函数已经结束了
- system("pause");// 让VS控制台程序不会一闪而过;
- return 0;
- }
复制代码
|
|