Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    420

    [C] getchar non bloccante

    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:

    codice:
    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
    the sALIEN

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    420
    ho usato questa funzione:

    codice:
    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:

    codice:
    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
    the sALIEN

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Ti suggerisco di leggere questo mio post.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    420
    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..
    the sALIEN

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    420
    ho rimodificato kbhit ma niente da fare.. qualche idea?
    the sALIEN

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.