上一篇讲到了异步
提到异步就要讲到回调函数了
回调函数的大概意思是:在此刻执行代码的时候并不马上调用你的代码,而是在完成某个条件后才调用,比如你设定了在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;
}
|