提升 asio async_read_some 超时
Posted
技术标签:
【中文标题】提升 asio async_read_some 超时【英文标题】:boost asio async_read_some timeout 【发布时间】:2017-02-27 14:11:15 【问题描述】:我使用此代码使用 async_read_some
和超时
readdata=0;
port_->async_read_some(boost::asio::buffer(vector),
boost::bind(readCallback));
//init async timer
boost::asio::deadline_timer timer(io);
timer.async_wait(boost::bind(timeoutHandler));
timer.expires_from_now(boost::posix_time::seconds(5));
io.reset();
do
io.run_one();
while (readdata==0);
这是我的回调
void readCallback()
std::cout << "READ CALLBACK: "<<x<<std::endl;
readdata=1;
return;
void timeoutHandler()
std::cout << "TIMEOUT CALLBACK: "<<x<<std::endl;
readdata=1;
我的问题是 timeoutHandler 是立即执行的,而不是在 5 秒后执行
【问题讨论】:
自从我使用 asio 已经有一段时间了,但是当您删除io.reset()
时会发生什么?这可能会导致async_wait
重置
就像@SteveVanOpstal 所说,您应该删除io.reset()
。您正在向异步事件处理程序 (io_service) 添加任务,然后在运行将执行您添加的事件的服务之前立即重置它(您使用 run_one()
执行此操作)。我建议您阅读并了解有关 io_service
及其工作原理的更多信息。
谢谢,我试过了,但结果一样,timeoutHandler()
被立即调用
【参考方案1】:
简单的错误。在调用async_wait
之前,您应该先进行expires_from_now
。
#include <iostream>
#include <asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
int main()
asio::io_service io_s;
asio::deadline_timer timer(io_s);
timer.expires_from_now(boost::posix_time::seconds(5));
timer.async_wait([](auto err_c) std::cout << "After 5 seconds" << std::endl; );
io_s.reset();
io_s.run();
return 0;
【讨论】:
以上是关于提升 asio async_read_some 超时的主要内容,如果未能解决你的问题,请参考以下文章
Boost ASIO,未调用 async_read_some 回调
asio::tcp::socket 的 async_read_some 和 async_receive 有啥区别?
传递给 boost::asio::async_read_some 的回调从未在 boost::asio::read_some 返回数据的使用中调用