Ответ 1
Второй пример в учебниках Boosts Asio объясняет это.
Вы можете найти здесь.
После этого проверьте третий пример, чтобы узнать, как вы можете его снова вызвать с помощью периодического интервала времени
Я хочу, чтобы очень простой периодический таймер вызывал мой код каждые 50 мс. Я мог бы создать поток, который будет спать по 50 мс все время (но это боль)... Я мог бы начать искать в Linux API для создания таймеров (но он не переносится)...
Я бы хотел использовать boost. Я просто не уверен, что это возможно. Повышает ли это функциональность?
Второй пример в учебниках Boosts Asio объясняет это.
Вы можете найти здесь.
После этого проверьте третий пример, чтобы узнать, как вы можете его снова вызвать с помощью периодического интервала времени
Очень простой, но полностью функциональный пример:
#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()
чтобы установить новое время истечения, иначе таймер сработает немедленно, потому что его текущее время уже истекло.
Для дальнейшего расширения этого простого примера. Это заблокирует выполнение, как было сказано в комментариях, поэтому, если вы хотите, чтобы работало больше 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();