在boost :: asio中,有一个deadline_timer有多个执行时间吗?

时间:2016-04-14 04:35:24

标签: c++ boost boost-asio

所以我正在试验deadline_timer类并编写下面的代码,看看我是否可以在deadline_timer上使用多个async_wait操作,这些操作将在不同的时间执行。

下面我在主要功能的底部创建一个截止时间计时器,最初将其设置为3秒后过期。然后我调用async_wait操作并将第一个print函数作为处理程序传递。然后我使用expires_from_now操作设置到期时间,我打算只影响第二个async_wait调用,它将print2作为处理程序。运行它的输出低于代码。

这是test1.cpp

#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/bind.hpp>
#include <time.h>
#include <sys/time.h>

double get_wall_time(){
    struct timeval time;
    if (gettimeofday(&time,NULL)){
        //  Handle error
        return 0;
    }
    return (double)time.tv_sec + (double)time.tv_usec * .000001;

}
void print(double start, const boost::system::error_code& /*e*/)
{
  std::cout << "Hello, world!" << std::endl;
  std::cout << get_wall_time() - start << std::endl;


}
void print2(double start, const boost::system::error_code& /*e*/)
{
  std::cout << "SECOND Hello, world!" << std::endl;
  std::cout << get_wall_time() - start << std::endl;


}

int main(int argc, char* argv[])
{
  boost::asio::io_service io;
  boost::asio::deadline_timer timer(io, boost::posix_time::seconds(3));
  auto start = get_wall_time();
  timer.async_wait(boost::bind(print, start, boost::asio::placeholders::error));
  timer.expires_from_now(boost::posix_time::seconds(20));
  timer.async_wait(boost::bind(print2, start, boost::asio::placeholders::error));

  io.run();
  return 0;
}

这是输出

Hello, world!
0.000774145
SECOND Hello, world!
20.0085

这是在使用到期修改注释掉第二个async_wait之后的输出。

Hello, world!
3.00079

正如您所看到的那样,当我打算在3秒后执行它时,第一个处理程序会立即执行。第二个处理程序在20秒后正确执行。有没有什么方法可以在没有创建一堆deadline_timer的情况下获得我想要的行为?

1 个答案:

答案 0 :(得分:1)

计时器一次只能有一个未完成的async_wait。 IIRC,发出另一个隐式取消第一个(它将使用错误代码触发它的处理程序),就像你调用cancel()后跟async_wait()一样。

如果您想响应2个计时器事件,您有2个选择。要么有2个定时器,要么设置超时并在第一个处理程序中发出第​​二个async_wait。