Romper ejecucion de un bucle

Iniciado por soyloqbuskas, 30 Octubre 2012, 07:57 AM

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

soyloqbuskas

¡Buenas a todos!

Estoy haciendo un programa que tiene un bucle el cual quiero parar cuando el usuario presione la tecla 'q'. El problema esta en que con funciones como getch() y demas, el bucle para su ejecucion y espera a que el usuario presione una tecla y esto es lo que no quiero. La idea es que el bucle funcione en todo momento y que cuando el usuario presione 'q' se finalice el bucle.

He probado varias ideas que no me han salido bien....como por ejemplo usar hilos de tal forma que un hilo tiene el bucle y el otro hilo el getch()....tambien he probado ha hacer lo mismo pero con procesos y tampoco me ha salido bien....

Asi que como estoy un poco atascado, cansado y deseperado....creo que lo que me queda es hacer polling al teclado....el problema es que sé que esta tecnica va a funcionar seguro pero no se implementarlo....Imagino que sera con alguna funcion que lea el stdin o algo asi...

¿Alguien sabe como hacer polling al teclado para leer la pulsacion de una tecla?

NOTA: estoy programando en C para linux

Gracias, un saludo.
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

BlackZeroX

Usa hilos... Así matas el hilo en el momento que desees.

Dulces Lunas!¡.
The Dark Shadow is my passion.

soyloqbuskas

Pufff ando atascado....la verdad es que no sa casi nada de hilos....

He probado esto....
#include <stdio.h>
#include <pthread.h>
#include <string.h>

void * pararBucle();

char * c="a";

int main(){

        pthread_t hilo;
        pthread_create(&hilo,NULL, pararBucle,NULL);

        printf("Iniciando bucle infinito\n");
        while(strcmp(c,"q")){

        }

        return 0;
}

void * pararBucle(){

        char * aux="a";
        while(strcmp(aux,"q"))
                fgets(aux,1,stdin);

        printf("Presionaste q\n");
        c="q";
        return (void *)"q";
}


Pero me da fallo de segmentacion....

¿Alguna sugerencia?
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

rir3760

El problema se encuentra en esta parte:
char *aux = "a";

while (strcmp(aux,"q"))
   fgets(aux,1,stdin);

El programa revienta porque la variable "aux" almacena la dirección en memoria de una cadena literal y estas no deben modificarse.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

0xDani

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

soyloqbuskas

¡Gracias por sus respuestas!

Al final el codigo me ha quedado asi...

#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>

void * pararBucle();

char * c="a";

int main(){

        pthread_t hilo;
        pthread_create(&hilo,NULL, pararBucle,NULL);

        printf("Iniciando bucle infinito\n");
        while(strcmp(c,"q")){

        }

        return 0;
}

void * pararBucle(){

        char  aux='a';
        while(aux!='q')
                read(STDIN_FILENO,&aux,1);
        printf("Presionaste q\n");
        c="q";
        return (void *)"q";
}


Lo unico que tiene una variable global que no se como quitar.
He probado a pasarle la variable c a la funcion pthread_create() asi:
pthread_create(&hilo,NULL, pararBucle,(void *) c);

Y luego le paso un void * a  la funcion pararBucle(void * c){}
Con estos cambios el programa compila, pero la funcion pararBucle cuando acaba no cambia el valor de c y el bucle infinito no para.

Asi que....¿que debo hacer para que la variable c quede compartida por ambos hilos?

Gracias, un saludo.
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw