elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Romper ejecucion de un bucle
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Romper ejecucion de un bucle  (Leído 2,618 veces)
soyloqbuskas

Desconectado Desconectado

Mensajes: 218


¡El conocimiento es de todos!


Ver Perfil
Romper ejecucion de un bucle
« 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.


En línea

"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
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Romper ejecucion de un bucle
« Respuesta #1 en: 30 Octubre 2012, 08:29 am »

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

Dulces Lunas!¡.


En línea

The Dark Shadow is my passion.
soyloqbuskas

Desconectado Desconectado

Mensajes: 218


¡El conocimiento es de todos!


Ver Perfil
Re: Romper ejecucion de un bucle
« Respuesta #2 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?
En línea

"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


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Romper ejecucion de un bucle
« Respuesta #3 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
En línea

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


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: Romper ejecucion de un bucle
« Respuesta #4 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
En línea

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

Desconectado Desconectado

Mensajes: 218


¡El conocimiento es de todos!


Ver Perfil
Re: Romper ejecucion de un bucle
« Respuesta #5 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.
En línea

"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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Romper MD5 , falsear?
Programación Visual Basic
nahueld 2 1,983 Último mensaje 22 Abril 2008, 21:24 pm
por nahueld
Duda (Parar bucle con dato boolean) [bucle while]
Java
Dem0ny 5 18,297 Último mensaje 17 Diciembre 2008, 17:43 pm
por Dem0ny
Ayuda!! Problema de ejecución en un bucle
Programación C/C++
jbuitrago 3 2,304 Último mensaje 21 Septiembre 2016, 13:38 pm
por Nucleorion
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines