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

Я адаптировалшаг 3 из учебника Boost Asio бежать вечно и отображать «галочку»; и & lt; tock & quot; один раз в секунду вместо счетчика:

#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

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, используя встроенный обработчик службы или написав свой собственный?

EDIT, ELABORATION:

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

 while (std::cin.getline(

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

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

Ответы на вопрос(2)

Ваш ответ на вопрос