Deadline_timer 在循环中调用 async_connect 时未触发

Deadline_timer not firing while calling async_connect in a loop

尝试按照 boost 文档建议的类似方式使用 deadlinetimer: https://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/example/timeouts/blocking_tcp_client.cpp

代码: JNI 线程:

HttpClient client(io_service);
client.doAsyncOperation()
io_service.run()

HttpClient:

 doAsyncOperation(){
     timer_.expires_from_now(boost::posix_time::seconds(10));
     mSocket.async_connect( endpoint,
                       boost::bind(&HttpClient::handle_connect_async, this,
                                   boost::asio::placeholders::error)

}

void HttpClient::check_deadline(){
if (timer_.expires_at() <= deadline_timer::traits_type::now())
{
    mSocket.cancel();
}else{

   timer_.async_wait(boost::bind(&SchamanHttpClient::check_deadline, this));
}

}

更新: 修复:运行 io_service 在单独的线程上

因此,在 JNI 线程内:

 HttpClient client(io_service);
 client.doAsyncOperation()
 boost::thread t(boost::bind(&boost::asio::io_service::run,&io_service));
io_service.run();
t.join();

HttpClient:

void HttpClient::check_deadline(){
if (timer_.expires_at() <= deadline_timer::traits_type::now())
{
    mSocket.cancel();
    io_service.stop();
}else{

   timer_.async_wait(boost::bind(&SchamanHttpClient::check_deadline, this));
}

None 这些示例不再是那样了。长期以来,存在更好的界面。一定要在最新版本的 boost 中查看这些示例:

libs/asio/example/cpp03/timeouts/blocking_tcp_client.cpp
libs/asio/example/cpp11/timeouts/blocking_tcp_client.cpp

The check_deadline() is never called again. What is wrong?

多种可能性:

  • 没有操作超时(10s 很多)
  • 你不是运行io_service(如果你不poll/run任务,什么都不会发生)
  • 定时器被破坏

但是,我认为最有可能让您感到困惑的是:当计时器过期(超时)时,它会将其设置为永不过期:

void HttpClient::check_deadline() {
    if (timer_.expires_at() <= deadline_timer::traits_type::now()) {
        mSocket.cancel();
        timer_.expires_at(boost::posix_time::pos_infin);
    }
    timer_.async_wait(boost::bind(&HttpClient::check_deadline, this));
}

简而言之,所有这些'blocking IO with timeouts'背后的整个模式是你在每个操作之前设置一个超时