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'背后的整个模式是你在每个操作之前设置一个超时。
尝试按照 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'背后的整个模式是你在每个操作之前设置一个超时。