gpt4 book ai didi

c++ - asio::read with timeout

转载 作者:IT老高 更新时间:2023-10-28 22:35:59 26 4
gpt4 key购买 nike

我需要知道如何在超时时读取(同步或异步无关紧要)。我想检查设备是否与串行端口连接。

为此,我使用 asio::write 然后等待设备的响应。

如果连接了设备 asio::read(serial, boost::asio::buffer(&r,1)) 工作正常,但如果没有设备,程序将停止,即为什么我需要超时

我知道我需要一个 deadline_timer 但我不知道如何在 async_read 函数中使用它。

举例说明它的工作原理会很有帮助。

我知道有很多类似的主题,我阅读了很多,但我找不到可以帮助我解决问题的解决方案!

最佳答案

code posted by Igor R.没有为我编译。这是我改进的他的代码版本,效果很好。它使用 lambdas 来摆脱 set_result 辅助函数。

template <typename SyncReadStream, typename MutableBufferSequence>
void readWithTimeout(SyncReadStream& s, const MutableBufferSequence& buffers, const boost::asio::deadline_timer::duration_type& expiry_time)
{
boost::optional<boost::system::error_code> timer_result;
boost::asio::deadline_timer timer(s.get_io_service());
timer.expires_from_now(expiry_time);
timer.async_wait([&timer_result] (const boost::system::error_code& error) { timer_result.reset(error); });

boost::optional<boost::system::error_code> read_result;
boost::asio::async_read(s, buffers, [&read_result] (const boost::system::error_code& error, size_t) { read_result.reset(error); });

s.get_io_service().reset();
while (s.get_io_service().run_one())
{
if (read_result)
timer.cancel();
else if (timer_result)
s.cancel();
}

if (*read_result)
throw boost::system::system_error(*read_result);
}

关于c++ - asio::read with timeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13126776/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com