io_service截止日期定时器不会定期运行

时间:2014-10-20 06:14:11

标签: c++ boost

我想在课堂里定期制作一个10秒的计时器,但它不起作用。它将在第一次打印10秒计数。但在那之后,它不会再等待10秒。具体代码。

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

class test {
    boost::asio::io_service& a;
    boost::asio::deadline_timer t;
    int count;

void print(const boost::system::error_code& /*e*/)
{
    while(true)
    {
        std::cout << count << " ";
        ++(count);
        t.expires_at(t.expires_at() + boost::posix_time::seconds(10));
        t.async_wait(boost::bind(&test::print, this, boost::asio::placeholders::error));
    }
}
public:
    test(boost::asio::io_service& io) : a(io), t(io, boost::posix_time::seconds(10)) {
        count = 0;
    };
    void start() {
        t.async_wait(boost::bind(&test::print, this, boost::asio::placeholders::error));
    }
};
int main()
{
    boost::asio::io_service io;
    int count = 0;
    test b(io);
    b.start();
    io.run();
    return 0;
}

1 个答案:

答案 0 :(得分:4)

您的print()函数有一个不必要的while(true)循环。一旦我们删除它,我们注意到输出并没有立即出现;那是因为std::cout是行缓冲的,我们从不写新行。这是完整的固定功能:

void print(const boost::system::error_code& /*e*/)
{
    std::cout << count << " " << std::flush;
    ++(count);
    t.expires_at(t.expires_at() + boost::posix_time::seconds(10));
    t.async_wait(boost::bind(&test::print, this, boost::asio::placeholders::error));
}