Boost 在循环中调用异步连接时未触发截止时间计时器
尝试以boost文档中建议的类似方式使用死线计时器: 代码: JNI线程: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
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%。我想只需将一些局部变量移动到成员即可)。