如何使用多个deadline_timers?

时间:2019-04-18 00:58:08

标签: c++ boost-asio

我要设置2个Boost Asio截止时间。第一个是立即启动,第二个是我希望能够在需要时打开和关闭。我的理解是,我只需要为多个计时器使用一个io_service对象。

问题在于,timer_A立即调用callback_a(),好像它没有任何工作要做。

我创建io_service并在构造函数中为其指定一个工作对象。

class TestClass
{
    std::shared_ptr<boost::asio::deadline_timer> timer_A;
}

TestClass()::TestClass 
{
    io = std::make_shared<boost::asio::io_service>();
    work = std::make_shared<boost::asio::io_service::work>(*io);
    // ...
}

然后我立即启动timer_B,但仅创建timer_A。我还没有给定timer_A的到期时间,所以它没有激活。

TestClass()::operator()() 
{

    timer_B = std::make_shared<boost::asio::deadline_timer>(*io,
        boost::posix_time::seconds(30));
    timer_B->async_wait(boost::bind(&TestClass::callback_b, this,
        boost::asio::placeholders::error));

    timer_A = std::make_shared<boost::asio::deadline_timer>(*io);

    std::unique_ptr<std::thread> io_thread =
        std::make_unique<std::thread>([&] { io->run(); });

    // ...

    while (running) {
        // ...
    }

    io->stop();
    io_thread->join();
}

稍后,在运行时,我会调用此函数并给它指定一个到期时间,以期望它会在调用后的10秒钟后到期。

TestClass::called_later()
{
    timer_A->expires_at(timer_A->expires_at() +
        boost::posix_time::seconds(10));
    timer_A->async_wait(boost::bind(&TestClass::callback_a, this,
        boost::asio::placeholders::error));
    // ...            
}

问题是timer_A立即过期,因为我看到它立即调用callback_a。

有人看到我要去哪里了吗?

0 个答案:

没有答案