Существует важное ограничение для асинхронного ввода-вывода с использованием stdin: Странный выброс исключения - назначить: операция не разрешена
Во-вторых, если вы используете async_read
, не используйте std::cin
вв то же время (вы просто сделаете два чтения).(Вместо этого посмотрите async_wait ).
Кроме того, вы должны быть в состоянии исправить высокую загрузку ЦП, правильно используя асинхронный ввод-вывод:
#include <boost/asio.hpp>
#include <iostream>
using namespace boost::asio;
int main()
{
io_service ioservice;
posix::stream_descriptor stream(ioservice, STDIN_FILENO);
char buf[1] = {};
std::function<void(boost::system::error_code, size_t)> read_handler;
read_handler = [&](boost::system::error_code ec, size_t len) {
if (ec) {
std::cerr << "exit with " << ec.message() << std::endl;
} else {
if (len == 1) {
std::cout << "keyinput=" << buf[0] << std::endl;
}
async_read(stream, buffer(buf), read_handler);
}
};
async_read(stream, buffer(buf), read_handler);
ioservice.run();
}
Как вывидно, что цикл while
был заменен цепочкой асинхронных операций.