升压ASIO async_read_some超时
问题描述:
我用用async_read_some
这个代码与超时升压ASIO 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秒后立即和不执行
答
简单的错误。在致电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以来已经有一段时间了,但是当你移除'io.reset()'时会发生什么?它可能导致'async_wait'重置 –
就像@SteveVanOpstal所说的那样,你应该移除'io.reset()'。您将任务添加到异步事件处理程序(io_service)中,然后在运行将执行您添加的事件(您使用'run_one()'执行的)的服务之前立即重置它。我建议你阅读并学习更多关于'io_service'和它是如何工作的。 –
谢谢,我试过了,但结果相同,即时调用'timeoutHandler()' – user2071938