Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: soyloqbuskas en 30 Octubre 2012, 07:57 am



Título: Romper ejecucion de un bucle
Publicado por: soyloqbuskas en 30 Octubre 2012, 07:57 am
¡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.


Título: Re: Romper ejecucion de un bucle
Publicado por: BlackZeroX en 30 Octubre 2012, 08:29 am
Usa hilos... Así matas el hilo en el momento que desees.

Dulces Lunas!¡.


Título: Re: Romper ejecucion de un bucle
Publicado por: soyloqbuskas en 30 Octubre 2012, 09:26 am
Pufff ando atascado....la verdad es que no sa casi nada de hilos....

He probado esto....
Código
  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #include <string.h>
  4.  
  5. void * pararBucle();
  6.  
  7. char * c="a";
  8.  
  9. int main(){
  10.  
  11.        pthread_t hilo;
  12.        pthread_create(&hilo,NULL, pararBucle,NULL);
  13.  
  14.        printf("Iniciando bucle infinito\n");
  15.        while(strcmp(c,"q")){
  16.  
  17.        }
  18.  
  19.        return 0;
  20. }
  21.  
  22. void * pararBucle(){
  23.  
  24.        char * aux="a";
  25.        while(strcmp(aux,"q"))
  26.                fgets(aux,1,stdin);
  27.  
  28.        printf("Presionaste q\n");
  29.        c="q";
  30.        return (void *)"q";
  31. }

Pero me da fallo de segmentacion....

¿Alguna sugerencia?


Título: Re: Romper ejecucion de un bucle
Publicado por: rir3760 en 30 Octubre 2012, 16:06 pm
El problema se encuentra en esta parte:
Código
  1. char *aux = "a";
  2.  
  3. while (strcmp(aux,"q"))
  4.   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


Título: Re: Romper ejecucion de un bucle
Publicado por: 0xDani en 30 Octubre 2012, 16:20 pm
Volveremos a poner el link: http://foro.elhacker.net/programacion_cc/como_hacer_que_un_bucle_se_ejecute_durante_x_milisegundos_en_linux-t369295.0.html;msg1775072#msg1775072


Título: Re: Romper ejecucion de un bucle
Publicado por: soyloqbuskas en 31 Octubre 2012, 01:55 am
¡Gracias por sus respuestas!

Al final el codigo me ha quedado asi...
Código
  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5.  
  6. void * pararBucle();
  7.  
  8. char * c="a";
  9.  
  10. int main(){
  11.  
  12.        pthread_t hilo;
  13.        pthread_create(&hilo,NULL, pararBucle,NULL);
  14.  
  15.        printf("Iniciando bucle infinito\n");
  16.        while(strcmp(c,"q")){
  17.  
  18.        }
  19.  
  20.        return 0;
  21. }
  22.  
  23. void * pararBucle(){
  24.  
  25.        char  aux='a';
  26.        while(aux!='q')
  27.                read(STDIN_FILENO,&aux,1);
  28.        printf("Presionaste q\n");
  29.        c="q";
  30.        return (void *)"q";
  31. }

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:
Código
  1. 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.