Asio Service Handler dla stdin keypress

Dostosowałem siękrok 3 samouczka Boost asio biegać wiecznie i wyświetlać „tick” i „tock” raz na sekundę zamiast licznika:

#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;
}

Teraz chcę asynchronicznie obsłużyć naciśnięcie klawisza stdin. Czy istnieje program obsługi io_service, za pomocą którego mogę reagować na naciśnięcia klawiszy, bez blokowania trybu uśpienia lub oczekiwania?

Na przykład chciałbym móc zaimplementować funkcję obsługi podobną do:

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

Oczekiwałbym, że moje wywołanie tego programu obsługi będzie czymś w rodzaju:

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

  io.run();

Czy jest to coś, co mogę zrobić z asio, korzystając z wbudowanej procedury obsługi lub pisząc własną?

EDIT, ELABORATION:

widziałemto pytanie, ale kod połączony z odpowiedzią po prostu to robimain:

 while (std::cin.getline(

Aplikacja, którą piszę, nie jest prostym gadżetem „zaznacz i stuknij”, który opisałem powyżej, ale będzie serwerem multiemisji. Kilka wątków roboczych będzie wysyłać pakiety do grup multiemisji, odpowiadać na wiadomości z głównego wątku i wysyłać wiadomości z powrotem do głównego wątku. Aplikacja z kolei będzie „napędzana” przez dane wejściowe ze standardowego wejścia - na przykład, gdy użytkownik naciśnie klawisz „P”, transmisja multicastowa zostanie wstrzymana, a gdy trafienie „Q”, cała sprawa zostanie zamknięta . W głównym wątku wszystko, co zrobię w odpowiedzi na te wejścia, to wysyłanie wiadomości do wątków roboczych.

Thewhile powyższa pętla nie zadziała w moim scenariuszu, ponieważ podczas oczekiwania na wejście stdin użytkownika główny wątek nie będzie w stanie przetwarzać wiadomości przychodzących z wątków roboczych. Niektóre z tych wiadomości z wątku roboczego wygenerują wyjście na standardowe wyjście.

questionAnswers(2)

yourAnswerToTheQuestion