asio service handler für stdin tastendruck

Ich habe mich angepasstSchritt 3 des Boost Asio-Tutorials um für immer zu rennen und "tick" und "tock" einmal pro Sekunde anstelle des Zählers anzuzeigen:

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

Jetzt möchte ich in der Lage sein, asynchron mit einem Tastendruck auf stdin umzugehen. Gibt es einen io_service-Handler, mit dem ich auf Tastendrücke reagieren kann, ohne den Ruhezustand oder das Warten zu blockieren?

Zum Beispiel möchte ich in der Lage sein, eine Handler-Funktion ähnlich zu implementieren:

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

Und ich würde erwarten, dass mein Aufruf dieses Handlers in etwa so aussieht:

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

  io.run();

Kann ich das mit asio tun, indem ich entweder einen eingebauten Service-Handler verwende oder meinen eigenen schreibe?

EDIT, ELABORATION:

ich habe gesehendiese Frage, aber der verknüpfte Code in der bestätigten Antwort tut dies einfach inmain:

 while (std::cin.getline(

Bei der Anwendung, die ich schreibe, handelt es sich nicht um das oben beschriebene einfache Tick-tock-Tap, sondern um einen Multicast-Server. Mehrere Worker-Threads senden Pakete an Multicast-Gruppen, antworten auf Nachrichten vom Haupt-Thread und senden Nachrichten zurück an den Haupt-Thread. Die Anwendung wird wiederum durch die Eingabe von stdin "gesteuert". Wenn der Benutzer beispielsweise die Taste "P" drückt, wird die Multicast-Übertragung unterbrochen, und wenn "Q" gedrückt wird, wird das Ganze beendet . Im Haupt-Thread werde ich als Antwort auf diese Eingaben nur Nachrichten an die Worker-Threads senden.

Daswhile Die obige Schleife funktioniert in meinem Szenario nicht, da der Hauptthread, während er auf die Standardeingabe des Benutzers wartet, keine Nachrichten verarbeiten kann, die von den Arbeitsthreads eingehen. Einige dieser Nachrichten aus dem Arbeitsthread generieren eine Ausgabe an stdout.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage