《C++Boost库asio》第二篇 为回调函数增加更多的参数
怎么为回调函数增加更多的参数:默认的只有一个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秒后才调用,或者在用户点击了按钮后才调用。(具体的意思可以百度,我又偷懒了{:10_250:})
怎么为回调函数增加更多的参数?
默认的只有一个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 (推荐){:10_279:}
// 每隔一秒打印一次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((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;
}
页:
[1]