Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost::asio::deadline\u timer cancel()方法未调用计时器处理程序_C++_Boost_Https_Timer_Boost Asio - Fatal编程技术网

C++ boost::asio::deadline\u timer cancel()方法未调用计时器处理程序

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()方法停止计时器,并根据文档状态调用超时句柄 此函数强制对计时器完成任何挂起的异步等

Boost 1.69

嗨。我正在尝试创建一个类来执行https,它执行请求,但也有一个用于错误检查的超时

我正在为https使用boost beast函数(工作正常),我正在使用deadline_timer类设置计时器

我将https请求和计时器设置为在同一IO_上下文上运行。这个想法是,如果超时发生,我想抛出一个错误并停止IO上下文的执行,或者如果https工作正常,我想停止计时器

我正在尝试使用
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();
}