Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: gonzaloi en 3 Mayo 2011, 04:11 am



Título: Input no bloqueante
Publicado por: gonzaloi en 3 Mayo 2011, 04:11 am
Hola.... que tal gente ??

Alguien conoce alguna funcion o manera (dentro del estandar de C/C++) de ingrasar datos desde el teclado sin bloquear el programa esperando el input ??

Algo comooo:

char c='x';
While(c != 'q'){
//codigo que setea el valor de c solo si se ingreso alguna tecla desde teclado
}

La idea que el bucle se repita "infinitas" veces, sin congelar el programa a la espera del ingreso por teclado, hasta que se ingrese 'q'

Muchas gracias!!



Título: Re: Input no bloqueante
Publicado por: gonzaloi en 3 Mayo 2011, 04:33 am
Bueno, lei en varios lados y no encuentro nada portable.

Se me ocurre lanzar un hilo a parte con el proceso principal y dejar el hilo principal congelado con un "cin >> c;" . Pero mi duda es, es performante esto ??


Título: Re: Input no bloqueante
Publicado por: pucheto en 3 Mayo 2011, 05:40 am
Bueno, lei en varios lados y no encuentro nada portable.

Se me ocurre lanzar un hilo a parte con el proceso principal y dejar el hilo principal congelado con un "cin >> c;" . Pero mi duda es, es performante esto ??
No tendrias problemas de performance pq el thread ese que hace la lecutura pasa a estar bloqueado... ( hasta que no se termine su operacion de I/O el scheduler ni se gasta en mirarlo... ) igual es poco recomendable... Conta un poco mas que es lo que queres hacer y vemos que se puede hacer...


Título: Re: Input no bloqueante
Publicado por: EvilGoblin en 3 Mayo 2011, 14:52 pm
Por hilos no podrias, va, si podrias, pero ten en cuenta que tienes 1 solo "puntero" (si estamos hablando de MS-DOS) que va a escribir. Y si haces refrescar la pantalla cada X milisegundos y que el puntero este abajo a la espera de algun comando, se va a volver muy lento y feo.

La opcion "mas viable" es 1 solo hilo (el principal) y que no refresquee TODA la pantalla, solo los datos que se modifican, y un while que vaya recorriendo toda la pantalla y modificando los datos, y cuando reciba alguna tecla que la agrege en el lugar de INPUT.

Para recibir teclas sin BLOCK hay una libreria no standard liviana, _kbhit()

sino, instala y aprende a usar ncurses xD (Funciona muy bien, se usa mucho para consola)


Título: Re: Input no bloqueante
Publicado por: gonzaloi en 3 Mayo 2011, 15:44 pm
No tendrias problemas de performance pq el thread ese que hace la lecutura pasa a estar bloqueado... ( hasta que no se termine su operacion de I/O el scheduler ni se gasta en mirarlo... ) igual es poco recomendable... Conta un poco mas que es lo que queres hacer y vemos que se puede hacer...

Con el comentario del scheduler me dijistes todo en cuanto a la performance. Gracias.

Lo que estoy haciendo es un programita servidor que acepta conexiones de clientes(por cada conexion lanzo un hilo) hasta que se ingrese por teclado la tecla 'q'. Cuando se ingresa esta tecla, se cierran todas las conexiones y se finaliza el programa.

Creo que voy a hacer asi, dejar bloqueado el hilo principal a la espera del ingreso de la tecla(con un "cin<< teclaPresionada;"), y en otro hilo acepto las conexiones.

Saludos !!