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.