我要设置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。
有人看到我要去哪里了吗?