Подтвердить что ты не робот

С++ Boost ASIO простой периодический таймер?

Я хочу, чтобы очень простой периодический таймер вызывал мой код каждые 50 мс. Я мог бы создать поток, который будет спать по 50 мс все время (но это боль)... Я мог бы начать искать в Linux API для создания таймеров (но он не переносится)...

Я бы хотел использовать boost. Я просто не уверен, что это возможно. Повышает ли это функциональность?

4b9b3361

Ответ 1

Второй пример в учебниках Boosts Asio объясняет это.
Вы можете найти здесь.

После этого проверьте третий пример, чтобы узнать, как вы можете его снова вызвать с помощью периодического интервала времени

Ответ 2

Очень простой, но полностью функциональный пример:

#include <iostream>
#include <boost/asio.hpp>

boost::asio::io_service io_service;
boost::posix_time::seconds interval(1);  // 1 second
boost::asio::deadline_timer timer(io_service, interval);

void tick(const boost::system::error_code& /*e*/) {

    std::cout << "tick" << std::endl;

    // Reschedule the timer for 1 second in the future:
    timer.expires_at(timer.expires_at() + interval);
    // Posts the timer event
    timer.async_wait(tick);
}

int main(void) {

    // Schedule the timer for the first time:
    timer.async_wait(tick);
    // Enter IO loop. The timer will fire for the first time 1 second from now:
    io_service.run();
    return 0;
}

Обратите внимание, что очень важно вызвать expires_at() чтобы установить новое время истечения, иначе таймер сработает немедленно, потому что его текущее время уже истекло.

Ответ 3

Для дальнейшего расширения этого простого примера. Это заблокирует выполнение, как было сказано в комментариях, поэтому, если вы хотите, чтобы работало больше io_services, вы должны запустить их в потоке, например так...

boost::asio::io_service io_service;
boost::asio::io_service service2;
timer.async_wait(tick);
boost::thread_group threads;
threads.create_thread(boost::bind(&boost::asio::io_service::run, &io_service));
service2.run();
threads.join_all();