En una aplicación gráfica, ejecuto comandos de depuración usando la entrada de la consola. Cuando se crea la consola, también se crea un nuevo hilo para reunir los comandos del usuario que maneja toda esa entrada, la aplicación gráfica continúa ejecutándose en paralelo. Yo uso la biblioteca boost :: thread.¿Es posible detener cin de la entrada de espera?
Funciona bien hasta el momento, sin embargo, no he encontrado una buena solución para detener la ejecución de este hilo. El hilo está siempre a la espera de una entrada de usuario:
while(appRunning)
{
std::cin>>theUserCommand;
// ...do stuff
}
Luego, cuando termina la aplicación gráfica, se detendrá todas las funciones de la consola, en la que incluyo el hilo:
appRunning = false;
// do some more related clean up
myListeningThread->join();
Como se puede ver la std :: cin esperará la entrada del usuario, después de que se haya llamado a la unión. Una de las soluciones que probé es crear eventos "sintetizando las pulsaciones de teclas", std :: cin obtendrá cualquier valor que envíe con un ENTRAR, el hilo terminará muy bien, esta solución es horrible y no quiero mantenerla . Además, funcionó en uno de los entornos donde se ejecuta la herramienta, pero falla cuando traté de usarlo junto con una API de UI. ¿Podrían guiarme cómo puedo solucionar esto de manera correcta? Realmente no puedo decir con certeza si en la documentación de C++ hay una función para detener std :: cin esperando la entrada del usuario, y solo y continuar la ejecución del programa, ¿es posible?
EDIT: bien Me parece que keybd_event es un poco engañoso para algunos entornos, especificando explícitamente que el manejador de entrada con WriteConsoleInput funciona bien.
Existen varias posibilidades, pero todas dependen del sistema operativo. ¿Para qué sistema operativo es este programa? – zwol
Win/VStudio9.0, utilicé keybd_event para la solución que mencioné, no hay problema si depende del sistema operativo. ¿Cómo me recomendarías que lo arreglara? – notNullGothik
BTW, SetConsoleCtrlHandler realmente no funciona para mí, esto terminará el proceso de solicitud omitiendo toda la limpieza para que la aplicación finalice. – notNullGothik