У меня нет опыта работы с таймерами Asio. Но если вы делаете
void somefunc( void )
{
boost::asio::io_service io;
boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
}
Тогда таймер выходит из области видимости при выходе из функции. Так что с этим кодом не нужно ждать. Если вы добавите t.wait () к этому коду, он подождет 5 секунд и выйдет из функции, а таймер выйдет из области видимости.
void somefunc( void )
{
boost::asio::io_service io;
boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
t.async_wait(somecallback);
io.run();
}
Во втором примере таймер выходит из области видимости при выходе из функции.
Если вы хотите обойти таймер, я думаю, вы должны написать так.
void somefunc( void )
{
boost::asio::io_service io;
while( something )
{
boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
t.async_wait(somecallback);
io.run();
}
}
Это будет держать таймер в стеке на один оборот в цикле, а затем он будет воссоздан. Если вы поместите таймер за пределы цикла, он никогда не выйдет за рамки видимости. Но тогда вы должны сбросить его каким-либо образом, включив цикл. Но я не вижу такой функции.
РЕДАКТИРОВАТЬ : В примере с async_wait () таймер будет уничтожен вне области, непосредственно без завершения, если у вас нет io.run (), чтобы заставить его ждать. И я бы предположил, что дескриптор deadline_timer () выполнит отмену таймера при попадании в деструктор.