Boost Asio异步读取数据超时问题

3
我使用这段代码,使用带有超时的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重置。 - Steve Van Opstal
就像@SteveVanOpstal所说,您应该删除那个io.reset()。您正在向异步事件处理程序(io_service)添加任务,然后立即在运行将执行您添加的事件的服务之前重置它(使用run_one())。我建议您阅读并了解更多关于io_service及其工作原理的知识。 - The Quantum Physicist
谢谢,我尝试过了,但结果一样,timeoutHandler()立即被调用。 - user2071938
1个回答

3

简单的错误。在调用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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接