manipulador de serviço asio para keypress stdin
Eu adapteipasso 3 do tutorial Boost asio para executar para sempre e exibir "tick" e "tock" uma vez por segundo em vez do contador:
#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;
}
Agora quero assíncrona ser capaz de manipular um pressionamento de tecla em stdin. Existe um manipulador de io_service que eu possa usar para responder a pressionamentos de tecla, sem bloquear suspensões ou esperas?
Por exemplo, gostaria de poder implementar uma função de manipulador semelhante a:
void handle_keypress(const boost::error_code&,
char c)
{
std::cout << "Tap '" << c << "'\n";
}
E eu esperaria que minha invocação desse manipulador fosse algo como:
char c = 0;
boost::asio::stdin_receiver sr(io);
st.async_wait(boost::bind(handle_keypress, boost::asio::placeholders::error, &c));
io.run();
Isso é algo que eu posso fazer com o asio, usando um manipulador de serviço interno ou escrevendo o meu próprio?
EDITAR, ELABORAÇÃO:Eu tenho vistoessa questão, mas o código vinculado na resposta aceita simplesmente faz issomain
:
while (std::cin.getline(
O aplicativo que estou escrevendo não é esse simples dispositivo tick-tock-tap que descrevi acima, mas será um servidor multicast. Vários threads de trabalho estarão enviando pacotes para grupos multicast, respondendo a mensagens do thread principal e enviando mensagens de volta ao thread principal. O aplicativo, por sua vez, será "acionado" pela entrada do stdin - por exemplo, quando o usuário pressiona a tecla "P", a transmissão multicast será pausada, e quando o hit "Q" a coisa toda for desligada . No thread principal, tudo o que farei em resposta a essas entradas é enviar mensagens para os threads de trabalho.
owhile
O loop acima não funcionará no meu cenário porque, enquanto ele aguarda a entrada stdin do usuário, o thread principal não poderá processar mensagens vindas dos threads de trabalho. Algumas dessas mensagens do thread de trabalho irão gerar saída para stdout.