[C con Clase] Terminar programa al pulsar tecla escape.
Pedro Rodríguez González
sr.whiteskull en hotmail.com
Mie Sep 1 02:29:37 CEST 2010
Bueno no soy un lumbreras pero ésta demo o idea rápida de cómo hacerlo te podría ayudar, me voy al catre lo siento, recuerda compilar la aplicación con la librería de hilos POZI...
gcc -lpthread ...
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <termio.h>#include <sys/ioctl.h>#include <pthread.h>
#define STDINFD 0#undef getc
char teclaPulsada(void);
void *funcionAplicacion(void *);void *funcionDetectaTecla( void *);
// variable global que reocge las teclaschar tecla=0;
int main(void){ pthread_t detectaTecla, aplicacion; pthread_create( &aplicacion , NULL, funcionAplicacion, NULL); pthread_create( &detectaTecla, NULL, funcionDetectaTecla, NULL);
pthread_join( aplicacion, NULL); pthread_join( detectaTecla, NULL);
// no llega hasta aquí, porque detectaTEcla está en un bucle infinito return 0;}
void *funcionDetectaTecla( void * ){ while(true) tecla=teclaPulsada();}
void *funcionAplicacion( void * ){ struct termio parametro_anterior; ioctl(STDINFD,TCGETA,¶metro_anterior); // hacemos un backup, TC get
// Aquí estaría la aplicación en si... while(tecla!=27) { printf("...y sigue... (tecla pulsada= %d )\n",tecla); } // Habría que matar el otro hilo o buscar una forma mejor... // de lo contrario hay que dejar todo como estaba si no... // no podremos ver las teclas al pulsarlas y tendremos una ... // terminal fantasma... ioctl(STDINFD,TCSETA,¶metro_anterior); // lo dejamos como estaba TC set exit(0); // salimos a la fuerza}
char teclaPulsada(void) { char caracter; struct termio parametro_anterior, parametro; ioctl(STDINFD,TCGETA,¶metro_anterior); // hacemos un backup, TC get parametro = parametro_anterior; parametro.c_lflag &= ~(ICANON|ECHO); parametro.c_cc[4] = 1; ioctl(STDINFD,TCSETA,¶metro); // le pasamos los nuevos paramentros fflush(stdin); fflush(stderr); fflush(stdout); // vaciamos los bufferes read(STDINFD,&caracter,1); // Leemos un byte del buffer y lo asignamos al caracter ioctl(STDINFD,TCSETA,¶metro_anterior); // lo dejamos como estaba TC set return caracter;}
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20100901/21b8e17b/attachment.html>
Más información sobre la lista de distribución Cconclase