所以我正在试验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的情况下获得我想要的行为?
答案 0 :(得分:1)
计时器一次只能有一个未完成的async_wait。 IIRC,发出另一个隐式取消第一个(它将使用错误代码触发它的处理程序),就像你调用cancel()后跟async_wait()一样。
如果您想响应2个计时器事件,您有2个选择。要么有2个定时器,要么设置超时并在第一个处理程序中发出第二个async_wait。