0

我正在学习 Boost.Asio,这是我正在谈论的代码: 链接到代码

我编写的以下代码似乎是相同的并且可以工作:(使用“-lboost_system”和“-std=c++11”编译)

#include<iostream>
#include<boost/asio.hpp>
#include<functional>
#include<boost/date_time/posix_time/posix_time.hpp>

typedef const boost::system::error_code cbse;
int main()
{
    boost::asio::io_service io;

    boost::asio::deadline_timer t(io,boost::posix_time::seconds(1));

    int count=0;

    std::function<void(cbse&)> 
    cb=[&](cbse&)
    {
        if(count<5)
        {
            std::cout<<"foo"<<std::endl;
            count++;
            t.expires_at(t.expires_at()+boost::posix_time::seconds(1));
            t.async_wait(cb);
        }
        else
            std::cout<<"done"<<std::endl;
    };

    t.async_wait(cb);

    std::cout<<"Hello"<<std::endl;

    io.run();

    return 0;
}

我错过了一些重要的区别吗?
从直觉上讲,递归调用回调对我来说似乎不是一个好主意,是否只是为了解释而在文档中给出?

4

2 回答 2

1

我错过了一些重要的区别吗?

您的代码看起来不错,并且与您链接到的示例代码具有大致相同的行为。唯一真正的区别是您是从封闭范围访问t和访问count,而不是使用参数。在像这样的简单示例中这是可以的,但可能会为更复杂的代码引入问题。

从直觉上讲,递归调用回调对我来说似乎不是一个好主意,是否只是为了解释而在文档中给出?

从回调中再次调用async_wait对于获得所需的行为至关重要。否则回调只会被调用一次。

像这样链接异步回调在小心完成时非常有用,但如果不这样做,很快就会导致难以理解/调试代码。

于 2013-10-03T15:32:03.157 回答
0

你的代码似乎没问题。

你所做的不是递归调用,因为deadlock_timer::async_wait只是发布一个事件并立即返回。回调实际上是从循环中调用的ioservice::run

于 2013-10-03T15:31:18.997 回答