首页 > 解决方案 > 如何使用多个deadline_timers?

问题描述

我正在设置 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。

任何人都看到我要去哪里错了吗?

标签: c++boost-asio

解决方案


推荐阅读