Как использовать несколько deadline_timers?

#c #boost-asio

#c #boost-asio

Вопрос:

Я настраиваю 2 ускоряющих asio deadline_timers. Первый должен начинаться немедленно, а второй я хотел бы иметь возможность включать и выключать при необходимости. Я понимаю, что мне нужно использовать только один объект 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(amp;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>([amp;] { 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(amp;TestClass::callback_a, this,
        boost::asio::placeholders::error));
    // ...            
}
 

Проблема в том, что Timer_A истекает немедленно, потому что я вижу, что он немедленно вызывает callback_a.

Кто-нибудь видит, где я ошибаюсь?

Комментарии:

1. что такое timer_ack?

2. Предоставьте MCVE. Почему вы создаете io_thread как локальную переменную? Где находится join этот поток?

3. @SeanF — извините, опечатка, исправил.

4. @rafix07 — Я отредактировал, чтобы показать соединение. io_thread должен выполняться только для TestClass, который сам по себе является потоком.

5. Срок действия вашего таймера истекает через 10 секунд после его предыдущего истечения, когда предыдущего времени истечения не было, так что кто знает, что это делает