PDA

Visualizza la versione completa : [C] Uso di una funzione getchar() non bloccante


thesalien
17-04-2007, 18:27
salve,
qualcuno sa se per caso esista un modo per rendere la getchar non bloccante?

sto usando la libreria curses e utilizzo anche getch solamente che se non uso questa combinazione:



c=getchar();
if (c==0) c=getch();


da problemi..


Ho letto qualcosa a proposito di kbhit ma purtroppo non esiste la versione di questa funzione per linux :[

fcntl e ioctl potrebbero servire in questo caso?

N.B.
Per la getch non ci sono problemi, basta usare la funzione timeout(1) e diventa non bloccante

thesalien
17-04-2007, 18:48
ho usato questa funzione:



int kbhit(void)

{

struct timeval tv;

fd_set read_fd;

tv.tv_sec=0;

tv.tv_usec=0;

FD_ZERO(&read_fd);

FD_SET(0,&read_fd);

if(select(1, &read_fd, NULL, NULL, &tv) == -1)

return 0;

if(FD_ISSET(0,&read_fd))

return 1;

return 0;

}


ed ho provato a fare una cosa del genere:



if (kbhit())
c = getchar();


Ora funziona ma non benissimo.. "lento" nel ricevere l'input ed inoltre a volte se premo una freccia va dalla parte opposta :confused:

andbin
17-04-2007, 20:35
Ti suggerisco di leggere questo (http://forum.html.it/forum/showthread.php?s=&postid=10450982#post10450982) mio post.

thesalien
17-04-2007, 21:19
ciao, si, l'avevo gi letto ma purtroppo non sono riuscito a risolvere il problema..


Tieni presente che:
a) getchar() "bufferizzata" (come le altre funzioni di I/O standard) e ritorna il carattere solo dopo aver premuto invio.
b) getchar() non in grado di leggere i tasti speciali (Fxx, frecce, ecc...).
c) Fare fflush(stdin) non ha senso e non serve, fflush adatta solo per stream di output. Il comportamento non definito/stabilito per stream di input.
d) Se vuoi fare letture "dirette" (non bufferizzate), usa getch() (nota, non standard) che in grado di leggere anche i tasti speciali tramite una sequenza di 2 codici (il primo pu essere 0 o 224).
e) Se vuoi maggior controllo, usa le API del sistema (su Windows le API Win32 per la gestione della console).


Praticamente usando la sola getch senza getchar, il programma non riesce a ricevere nessun input, e non parlo solo di frecce direzionali.. ad esempio, non riesce a prendere in input neppure la lettera 'q'.
Non so se c'entrino per qualche motivo gli oggetti System V dato che usando i thread ho potuto usare senza problemi getch. Usando la combinazione:


c=getchar();
if (c==0) c=getch();


il programma funziona benissimo (sia le frecce che tutti gli altri tasti vengono rilevati correttamente) ed infatti non quello il problema. Il problema consiste nel fatto che a me servirebbe una cosa simile alla funzione timeout() della libreria curses. Questa funzione rende la getch non bloccante, nel senso che dopo un tot di tempo, se non vi nessun input fa si che la getch restituista -1. Purtroppo questa funzione pero' non compatibile con getchar..

spero di essermi spiegato meglio..

thesalien
18-04-2007, 22:17
ho rimodificato kbhit ma niente da fare.. qualche idea?

Loading