C++ asio计时器何时超出范围?

C++ asio计时器何时超出范围?,c++,boost,boost-asio,C++,Boost,Boost Asio,我的意思是,假设您在asio计时器上执行async_wait,并将更新绑定到引用类型T的函数。假设您最初在堆栈上创建了T,然后将其传递给async_wait。在async_wait结束时,它调用async_wait本身,一次又一次地更新计时器。堆栈分配的类型是否会一直保持活动状态,直到计时器第一次不自我更新,或者在第一次调用函数后,该类型是否会超出范围?我没有asio计时器的经验。但如果你这样做了 void somefunc( void ) { boost::asio::io_service

我的意思是,假设您在asio计时器上执行async_wait,并将更新绑定到引用类型T的函数。假设您最初在堆栈上创建了T,然后将其传递给async_wait。在async_wait结束时,它调用async_wait本身,一次又一次地更新计时器。堆栈分配的类型是否会一直保持活动状态,直到计时器第一次不自我更新,或者在第一次调用函数后,该类型是否会超出范围?

我没有asio计时器的经验。但如果你这样做了

void somefunc( void )
{
  boost::asio::io_service io;

  boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
}
当计时器退出函数时,它就超出了范围。因此,有了这段代码,就不会再等待了。如果您将t.wait()添加到该代码中,它将等待5s并退出该函数,并且计时器超出范围

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()使计时器等待,则计时器将被销毁,超出范围,直接未完成。我猜Daildate\u timer()的构造函数在碰到析构函数时会取消计时器。

如果要编写一个函数,在堆栈上创建一个计时器,然后调用async\u wait,则在函数调用结束时会销毁计时器,并立即使用正确的错误参数调用回调

无法使用boost::bind将计时器对象传递给回调,因为该对象不可复制

不过,您可以在堆上管理绑定器,在每次调用async_wait时传递一个共享指针。这可能是这样的:

void MyClass::addTimer(int milliseconds) // Initial timer creation call
{
  boost::shared_ptr<boost::asio::deadline_timer> t
    (new boost::asio::deadline_timer
     (m_io_service, 
      boost::posix_time::milliseconds(milliseconds)));
  // Timer object is being passed to the handler
  t->async_wait(boost::bind(&MyClass::handle_timer,
                            this,
                            t,
                            milliseconds));

}

void MyClass::handle_timer(boost::shared_ptr<boost::asio::deadline_timer> & t,
                               int milliseconds)
{
  // Push the expiry back using the same tick
  t->expires_at(t->expires_at() + boost::posix_time::milliseconds(milliseconds));
  t->async_wait(boost::bind(&MyClass::handle_timer,
                            this,
                            t,
                            milliseconds));
  onTimer(); // Do something useful
}
void MyClass::addTimer(int毫秒)//初始计时器创建调用
{
boost::共享\u ptr t
(新的boost::asio::截止期计时器
(m______服务,
boost::posix_time::毫秒(毫秒));
//正在将计时器对象传递给处理程序
t->async_wait(boost::bind(&MyClass::handle_计时器),
这
T
毫秒);
}
void MyClass::handle_timer(boost::shared_ptr&t,
整数毫秒)
{
//使用相同的勾号将到期日期向后推
t->expires_at(t->expires_at()+boost::posix_time::毫秒(毫秒));
t->async_wait(boost::bind(&MyClass::handle_计时器),
这
T
毫秒);
onTimer();//做一些有用的事情
}

如果您能更好地解释如何使用async_wait(),那就太好了。可能是一些代码或元代码。你可能需要像小鸭子回答一样,用new创建计时器,把它传递给其他函数,得到你想要的效果。