Сервисный обработчик asio для нажатия клавиши stdin

Я адаптировал шаг 3 учебника по Boost asio, чтобы он выполнялся вечно и отображал "тик" и "так" один раз в секунду вместо счетчика:

#include 
#include 
#include 
#include 

void print(const boost::system::error_code& /*e*/,
    boost::asio::deadline_timer* t, int* count)
{
    if( !((*count) % 2) )
        std::cout << "tick\n";
    else
        std::cout << "tock\n";

    ++(*count);

    t->expires_at(t->expires_at() + boost::posix_time::seconds(1));
    t->async_wait(boost::bind(print,
          boost::asio::placeholders::error, t, count));
}

int main()
{
  boost::asio::io_service io;

  int count = 0;
  boost::asio::deadline_timer t(io, boost::posix_time::seconds(1));
  t.async_wait(boost::bind(print,
        boost::asio::placeholders::error, &t, &count));

  io.run();

  std::cout << "Final count is " << count << "\n";

  return 0;
}

Теперь я хочу для асинхронной обработки нажатия клавиши на стандартный ввод. Есть ли обработчик io_service, который я могу использовать для ответа на нажатия клавиш, не блокируя сон или ожидание?

Например, я хотел бы иметь возможность реализовать функцию-обработчик, подобную:

void handle_keypress(const boost::error_code&,
    char c)
{
    std::cout << "Tap '" << c << "'\n";
}

И я ожидаю, что мой вызов этого обработчика будет чем-то вроде:

  char c = 0;
  boost::asio::stdin_receiver sr(io);
  st.async_wait(boost::bind(handle_keypress, boost::asio::placeholders::error, &c));

  io.run();

Это то, что я могу сделать? с asio, либо используя встроенный обработчик службы, либо написав свой собственный?

РЕДАКТИРОВАТЬ, РАЗРАБОТКА:

Я видел этот вопрос , но связанный с ним код в принятом ответе просто делает это в main:

 while (std::cin.getline(

Приложение I Я пишу, это не простая штуковина тик-так-тап, которую я описал выше, а будет многоадресный сервер. Несколько рабочих потоков будут отправлять пакеты многоадресным группам, отвечать на сообщения из основного потока и отправлять сообщения обратно в основной поток. Приложение, в свою очередь, будет «управляться» вводом со стандартного ввода — например, когда пользователь нажимает клавишу «P», многоадресная рассылка будет приостановлена, а при нажатии «Q» все это выключается. . В основном потоке все, что я буду делать в ответ на эти входные данные, — это отправлять сообщения рабочим потокам.

Приведенный выше цикл whileне будет работать в моем сценарии, потому что, пока он ожидает ввода stdin от пользователя, основной поток не сможет обрабатывать сообщения, поступающие от рабочих потоков. Некоторые из этих сообщений из рабочего потока будут генерировать вывод на стандартный вывод.

7
задан Community 23 May 2017 в 12:25
поделиться