c++ - 如何调用处理程序?

标签 c++ boost asio

我不明白在 io_context 的情况下如何返回句柄被阻止了。最小示例:

void my_class::async_get_one_scan(
    std::function<void(const boost::system::error_code& ec, 
                       std::shared_ptr<my_chunked_packet>)> handler)
{
    asio::spawn(strand_, [this, handler] (asio::yield_context yield)
    {
        const auto work = boost::asio::make_work_guard(io_service_);
        my_chunk_buffer chunks;

        while (!chunks.full()) {
            std::array<uint8_t, 1000> datagram;
            boost::system::error_code ec;
            auto size = socket_.async_receive(asio::buffer(datagram), yield[ec]);

            if (!ec)
                process_datagram(datagram, size, chunks);
            else {
                handler(ec, nullptr);
                return;
            }
        }

        io_service_.post(std::bind(handler, boost::system::error_code, chunks.packet()));
    });
}

调试 asio 输出:

@asio|1532525798.533266|6*7|strand@01198ff0.dispatch
@asio|1532525798.533266|>7|
@asio|1532525798.533266|>0|
@asio|1532525798.533266|0*8|socket@008e345c.async_receive
@asio|1532525798.533266|<7|
@asio|1532525798.533266|<6|
@asio|1532525799.550640|0|socket@008e34ac.close
@asio|1532525799.550640|0|socket@008e345c.close
@asio|1532525799.551616|~8|

所以最后async_receive() #8|<6| 之后创建io_context.stop()被调用然后我不知道如何获得 error_code来自 yield_context调用处理程序。

问题#2 异步读取数据 block 以收集整个数据包是否是一种正确的方法?

最佳答案

根据定义,io_context::stop 阻止事件循环执行其他处理程序。因此无法将退出代码放入处理程序中,因为它不会被调用。

您可能希望有一个“软停止”功能,您可以停止向 io_context 允许新的异步任务并可选择取消任何挂起的操作。

如果挂起的操作可能需要太长时间,您将需要添加一个截止日期计时器,以在某个阈值时间间隔强制取消。

退出run 循环的常用方法是释放work 对象。参见 https://www.boost.org/doc/libs/1_67_0/doc/html/boost_asio/reference/io_context__work.html

关于c++ - 如何调用处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51520716/

相关文章:

c++ - 在 CLion 项目中链接 boost

c++ - 是否可以将 boost::any 或 boost::variant 与 boost::pool 一起使用?

c++ - 如何删除 QTabWidget 的 "padding"?

c++ - 如何使用 libvlc 播放 RTSP 流

c++ - 使用 boost 异步发送和接收自定义数据包?

c++ - boost::asio::async_read 无限循环接收到的数据为零字节

c# - 如何使用NAudio和ASIO直接读取输入缓冲区并进行回放?

c++ - 我如何告诉 lcov 在哪里可以找到我的 .cpp 和 .h 文件?

c++ - 实现以恒定间隔刷新的缓冲流的标准方法?

c++ - 使用 boost::asio::spawn 生成的 asio 处理程序中的 boost::property_tree::read_xml 段错误