Boost 在循环中调用异步连接时未触发截止时间计时器

Boost 在循环中调用异步连接时未触发截止时间计时器,boost,java-native-interface,boost-asio,Boost,Java Native Interface,Boost Asio,尝试以boost文档中建议的类似方式使用死线计时器: 代码: JNI线程: HttpClient client(io_service); client.doAsyncOperation() io_service.run() HttpClient client(io_service); client.doAsyncOperation() boost::thread t(boost::bind(&boost::asio::io_service::run,&io_servic

尝试以boost文档中建议的类似方式使用死线计时器:

代码: JNI线程:

HttpClient client(io_service);
client.doAsyncOperation()
io_service.run()
 HttpClient client(io_service);
 client.doAsyncOperation()
 boost::thread t(boost::bind(&boost::asio::io_service::run,&io_service));
io_service.run();
t.join();
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));
}
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));
}
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));
}
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));
}
void HttpClient::check_deadline(){

如果(timer_u.expires_at()这些示例中没有一个是这样的。很长一段时间以来,存在着更好的接口。请务必在最新版本的boost中查看这些示例:

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

不再调用check_deadline()。怎么了

许多可能性:

  • 无操作超时(10秒是很多)
  • 您没有运行io_服务(如果不轮询/运行任务,则不会发生任何事情)
  • 计时器坏了
但是,我认为最有可能让您困惑的是:当计时器过期(超时)时,它会将其设置为不再过期:

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));
}
void HttpClient::check_deadline(){

如果(计时器在()处过期)谢谢Sehe。我尝试过这个例子,但是异步连接立即退出。libs/asio/example/cpp11/timeouts/blocking\u tcp\u client.cpp当你甚至不说运行它的参数时,很难说出任何事情。请注意,这个演示是为一些行方式的文本协议服务器设计的。我已经关闭了服务器,看看是否可以处理这个问题是“没有联系”的情况有一个截止时间计时器。所以在我运行的每个代码中,我只设置了一个10秒的计时器。对于您建议使用的代码示例,async\u connect与EAGAIN一起退出。在我使用的所有其他示例中,它会在我到达那里的时候出现问题!我认为关于JNI和boost之间的交互,我没有掌握一些东西。我已经移动了“io_服务。运行”在一个线程中,现在计时器启动,检查_截止日期被调用。我需要了解的最后一件事是如何停止io_服务(从检查_截止日期内?)并加入。老实说,这听起来很奇怪(真的没有什么区别)。此外,在这种情况下,您最好首先使用异步连接(您的比例为96%。我想只需将一些局部变量移动到成员即可)。