C++ boost::asio::deadline\u timer cancel()方法未调用计时器处理程序
Boost 1.69 嗨。我正在尝试创建一个类来执行https,它执行请求,但也有一个用于错误检查的超时 我正在为https使用boost beast函数(工作正常),我正在使用deadline_timer类设置计时器 我将https请求和计时器设置为在同一IO_上下文上运行。这个想法是,如果超时发生,我想抛出一个错误并停止IO上下文的执行,或者如果https工作正常,我想停止计时器 我正在尝试使用C++ boost::asio::deadline\u timer cancel()方法未调用计时器处理程序,c++,boost,https,timer,boost-asio,C++,Boost,Https,Timer,Boost Asio,Boost 1.69 嗨。我正在尝试创建一个类来执行https,它执行请求,但也有一个用于错误检查的超时 我正在为https使用boost beast函数(工作正常),我正在使用deadline_timer类设置计时器 我将https请求和计时器设置为在同一IO_上下文上运行。这个想法是,如果超时发生,我想抛出一个错误并停止IO上下文的执行,或者如果https工作正常,我想停止计时器 我正在尝试使用cancel()方法停止计时器,并根据文档状态调用超时句柄 此函数强制对计时器完成任何挂起的异步等
cancel()
方法停止计时器,并根据文档状态调用超时句柄
此函数强制对计时器完成任何挂起的异步等待操作。每个已取消操作的处理程序都将使用boost::asio::error::operation\u中止的错误代码调用
但是,从未调用计时器处理程序。取消计时器时,如何调用计时器处理程序
下面是一些代码:
/* Set up timeout timer and start it */
boost::asio::deadline_timer timer{query->ioc,boost::posix_time::seconds(TIMEOUT_HTTPS)};
timer.async_wait(std::bind(&HttpsCom::on_timeout, this, std::placeholders::_1, query));
// Look up the domain name
std::cout << "Making the request..." << std::endl;
tcp::resolver resolver{query->ioc};
resolver.async_resolve(host, port, std::bind(&HttpsCom::on_resolve,this,std::placeholders::_1,std::placeholders::_2, query));
query->ioc.run();
if (latestError == HTTPS_SUCCESS){
std::size_t test = timer.cancel();
std::cout << test << std::endl; // Timer gets cancel as test = 1
}
/*设置超时计时器并启动它*/
boost::asio::deadline_timer{query->ioc,boost::posix_time::seconds(TIMEOUT_HTTPS)};
timer.async_wait(std::bind(&HttpsCom::on_timeout,this,std::placeholders::_1,query));
//查找域名
std::cout ioc.run();
if(latestError==HTTPS\u SUCCESS){
std::size\u t test=计时器。取消();
std::cout我解决了问题。似乎停止ioc只是删除或以某种方式忘记了排队的处理程序。因此,在调用计时器时。cancel()停止ioc后的函数不会带您去任何地方,因为它已经忘记了处理程序。我解决了问题。似乎停止ioc只是删除或以某种方式忘记了排队的处理程序。因此,在调用计时器时,停止ioc后的.cancel()函数不会带您去任何地方,因为它已经忘记了处理程序
void HttpsCom::on_timeout(const boost::system::error_code& ec, std::shared_ptr<HTTPSQueryStruct_t> query){
std::cout << "Timeout" << std::endl;
}
void HttpsCom::on_shutdown(boost::system::error_code ec, std::shared_ptr<HTTPSQueryStruct_t> query){
std::cout << "on_shutdown()" << std::endl;
// boost::ignore_unused(ec);
std::cerr << "on_shutdown" << ": " << ec.message() << std::endl;
/* If we get here the connection was closed gracefully */
setLatestErrorCode(HTTPS_SUCCESS);
query->ioc.stop();
}