¿Parar un bucle for pulsando una tecla?

Iniciado por jmhr98, 17 Agosto 2018, 22:07 PM

0 Miembros y 1 Visitante están viendo este tema.

Beginner Web

Hola  la solucion seria la siguiente xd

Código (cpp) [Seleccionar]
#include <iostream>

using namespace std;

int main()
{
char input=0;

cout << "Presione d para ejecutar ciclo" << endl;
while(1){
cin >> input;
if(input=='d'){
ejecutar ciclo();
}
else{
ejecutar_otras_acciones();
}
}
system("pause");
return 0;
}
7w7

ThunderCls

Cita de: jmhr98 en 18 Agosto 2018, 00:36 AM
Getch es para detectar si se ha pulsado una tecla o no. No entiendo la función que tendría en el hecho de detener el programa. ThunderCls, he usado tu código y no funciona.

El codigo de ejemplo que te puse fue solo una guía, igual no lo he probado,  aunque supongo que lo probaste dentro de un hilo diferente al winmain, cierto?. Como perfectamente te ha explicado NEBIRE, C++ no es un lenguaje trivial, así que no creas que seras un experto o que lograras codear todo lo que desees en un par de semanas.
La función cin.get() es una función síncrona, lo que significa que tu hilo principal se bloqueara al llamar a dicha función y solo continuara una vez haya leído una linea completa de la consola. Hasta donde se C++ no posee ninguna funcion estandar de entrada sin bloqueo del hilo principal. Las implementaciones de dichas funciones son dependiente de plataforma, en tu caso la solución al problema es fundamentalmente dependiente del sistema operativo, si en tu caso se trata de Windows, pudieras revisar algunas de estas opciones:

1- Instalar un hook de teclado con SetWindowsHookEx
https://stackoverflow.com/questions/10049764/detecting-escape-keypress-in-console-mfc-program
2- Usar un Control Handler Función con SetConsoleCtrlHandler
https://docs.microsoft.com/en-us/windows/console/registering-a-control-handler-function
3- Usar la función GetAsyncKeyState en un hilo separado a winmain
4- Usar _kbhit/_getch en un loop
https://stackoverflow.com/questions/6171132/non-blocking-console-input-c

*- Una opción multiplataforma seria usar la función cin.get() en un hilo separado del hilo de ejecución principal (como mi primer mensaje)

Para Linux y demás SO podrías hacer tus búsquedas en google: "Non-blocking console input C++"
-[ "...I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/

enriquemesa8080

Hola, yo aconsejo que pongas un thread de ejecucion aparte donde puedas mantener en uno el conteo del for (tal vez el hilo nuevo), y la comprobacion de si se està presionando la tecla en otro hilo. Quizas en el mismo main().

Busca como usar los threads. Ya que lo que tu necesitas es sencillo es cuestion de usar la API plana de Windows.

Usa windows.h.

Yo tengo un blog donde voy subiendo informacion. No te resolverè tu problema con codigo, pero si puedo darte tips para que mejores. Pendiente del blog.

enriquemesa8080.blogspot.com