[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,&parametro_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,&parametro_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,&parametro_anterior); // hacemos un backup, TC get     parametro = parametro_anterior;    parametro.c_lflag &= ~(ICANON|ECHO);    parametro.c_cc[4] = 1;        ioctl(STDINFD,TCSETA,&parametro); // 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,&parametro_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