asio io_service
запускается в своем собственном потоке, как только вы планируете событие таймера, он перезвонит вам в соответствующее время.
Вот полный пример:
#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
using namespace std;
class timed_class
{
public:
timed_class(boost::asio::io_service& io_service) : _timer(io_service)
{
// now schedule the first timer.
_timer.expires_from_now(boost::posix_time::milliseconds(100)); // runs every 100 ms
_timer.async_wait(boost::bind(&timed_class::handle_timeout, this, boost::asio::placeholders::error));
}
void handle_timeout(boost::system::error_code const& cError)
{
if (cError.value() == boost::asio::error::operation_aborted)
return;
if (cError && cError.value() != boost::asio::error::operation_aborted)
return; // throw an exception?
cout << "timer expired" << endl;
// Schedule the timer again...
_timer.expires_from_now(boost::posix_time::milliseconds(100)); // runs every 100 ms
_timer.async_wait(boost::bind(&timed_class::handle_timeout, this, boost::asio::placeholders::error));
}
private:
boost::asio::deadline_timer _timer;
};
int main(void)
{
boost::asio::io_service io_service;
timed_class t(io_service);
io_service.run();
return 0;
}
РЕДАКТИРОВАТЬ: для отправки в отдельном потоке,
boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service));
Вместо io_service.run();
, теперь основной поток будет продолжаться и по истечении времени ожидания, тогда io_service
позвонит handle_timeout