Dev - C++ - Ciclo for pararlo con una tecla

 
Vista:

Ciclo for pararlo con una tecla

Publicado por Jose Manuel (2 intervenciones) el 17/08/2018 22:16:03
¿Alguien sabe alguna forma de hacerlo? He usado un condicional if en el ciclo for. De la forma: if(cin.get()=='d') Return 0; pero el bucle se queda esperando a que yo pulse alguna otra tecla. Es decir, lo que quiero es que el bucle se vaya ejecutando y cuando yo pulse la d, se termine el programa. No que se quede esperando a que yo pulse la d u otra para funcionar y volver al mismo punto de pedirme otra vez que introduzca otra tecla. Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 338
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ciclo for pararlo con una tecla

Publicado por Martín (158 intervenciones) el 18/08/2018 21:25:41
Hola; tienes distintas formas de hacerlo usando threads. Lo normal sería pasar una señal al thread donde se está ejecutando el ciclo (condition_variable) y al comprobar la condición (en este caso una variable con el valor 'd'), terminaría el ciclo. Acá abajo pongo un ejemplo simple que sólo espera a que se pulse 'd' para salir del ciclo.

Como verás no es un asunto simple, pero creo que puedes resolver cada paso consultando la documentación en línea o la que tenga tu compilador.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
#include <future>
 
bool sacarme_de_aqui{ false };
std::mutex mtx;
int a{ 0 };
 
using namespace std::chrono_literals;
 
void ciclo_eterno()
{
    for (;;) {
 
        {
            std::lock_guard<std::mutex>lg(mtx);
            if (sacarme_de_aqui)
                break;
        }
 
 
        ++a;
        std::this_thread::sleep_for(100ms); // una pequeña pausa
 
    }
}
 
int main()
{
    // ejecuta ciclo_eterno() hasta que se pulse 'd':
 
    auto f = std::async(std::launch::async, ciclo_eterno);
 
    std::cout << "d para salir: ";
    char res;
 
    while (std::cin >> res) {
 
        if (res == 'd')
            break;
 
        std::cout << "d para salir: ";
    }
 
    {
        std::lock_guard<std::mutex>lg(mtx);
        sacarme_de_aqui = true;
    }
 
    f.get();
 
    std::cout << "a == " << a << '\n';
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar