dnfpk001 发表于 2017-7-9 11:12:11

《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调用回调的时候,回调过程中所绑定的参数的生命周期就非常的重要

dnfpk001 发表于 2017-7-10 10:48:36

上一篇讲到了异步

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

回调函数的大概意思是:在此刻执行代码的时候并不马上调用你的代码,而是在完成某个条件后才调用,比如你设定了在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]
查看完整版本: 《C++Boost库asio》第二篇 为回调函数增加更多的参数