Getchar non bloquant !!!

Messages postés
38
Date d'inscription
jeudi 8 août 2002
Statut
Membre
Dernière intervention
26 août 2004
- - Dernière réponse : FlorimondH
Messages postés
11
Date d'inscription
lundi 24 septembre 2007
Statut
Membre
Dernière intervention
13 mars 2010
- 19 févr. 2010 à 00:54
Salut tout le monde,

Je programme en C sous linux, et je voudrai savoir si il existe une astuce pour rendre le getchar non bloquant, ou existe t-il une fonction similaire a getchar mais non bloquant.
j'ai une boucle de ce genre:

do{
c=getchar();
/*
series d'actions
*/
while(c!='q');

le probleme c ke arrivé à la ligne du getchar le prog s'y arrete et attend ke j'appuie sur une touche et moi je voudrai que si je tape rien il continue, parce ke dans cet exemple c comme si je faisais tourner le prog moi meme en appuyant sur une touche (differente de 'q' bien sur), c comme si ct du pas a pas, donc si vous pouviez m'aider.

Niko
Afficher la suite 

7 réponses

Messages postés
249
Date d'inscription
mardi 16 juillet 2002
Statut
Membre
Dernière intervention
7 août 2003
1
0
Merci
-------------------------------
Réponse au message :
En fait tu veux savoir si la touche q a été pressé. Le gethar peut être non bloquant si le buffer est déjà plein. Mais ce n'est pas une solution car j'ai l'impression que tu désire détecter si la touche q a été pressée.

Pour cela utilise une bibliothèque ou les interuption du bios.
En tout cas je ne connais pas de fonction ANSI/ISO du C/C++ qui te signale qu'elle a été la touche pressé.

Sinon tu peux chercher dans le fichier équivalant à conio qui fourni getch();

-------------------------------

> Salut tout le monde,
>
> Je programme en C sous linux, et je voudrai savoir si il existe une astuce pour rendre le getchar non bloquant, ou existe t-il une fonction similaire a getchar mais non bloquant.
> j'ai une boucle de ce genre:
>
> do{
> c=getchar();
> /*
> series d'actions
> */
> while(c!='q');
>
> le probleme c ke arrivé à la ligne du getchar le prog s'y arrete et attend ke j'appuie sur une touche et moi je voudrai que si je tape rien il continue, parce ke dans cet exemple c comme si je faisais tourner le prog moi meme en appuyant sur une touche (differente de 'q' bien sur), c comme si ct du pas a pas, donc si vous pouviez m'aider.
>
> Niko
Commenter la réponse de trinitacs
Messages postés
455
Date d'inscription
mercredi 6 mars 2002
Statut
Membre
Dernière intervention
18 décembre 2003
0
Merci
salut,

getch(); voir dans <ncurses.h>
si c'est une fonction comme kbhit il faudrait l'écrire
Commenter la réponse de cmarsc
Messages postés
38
Date d'inscription
jeudi 8 août 2002
Statut
Membre
Dernière intervention
26 août 2004
0
Merci
j'ai deja teste tout ce ki pouvait ressembler a getchar de pres ou de loin dans <ncurses.h> et rien de convaincant.
cmarsc, je n'ai pas compris ta deuxieme phrase, je ne sais pas ce ke c ke kbhit...

Niko
Commenter la réponse de MasterNKZ
Messages postés
455
Date d'inscription
mercredi 6 mars 2002
Statut
Membre
Dernière intervention
18 décembre 2003
0
Merci
kbhit() <conio.h> (sous dos borland bien souvent) est une fonction qui detecte si une touche a été frappée, elle fait une boucle sans fin et s'arrecte une fois que l'on presse n'importe quelle touche, malheuresement est n'existe pas sous linux. il faut l'écrire nous même :-(
Commenter la réponse de cmarsc
Messages postés
455
Date d'inscription
mercredi 6 mars 2002
Statut
Membre
Dernière intervention
18 décembre 2003
0
Merci
getch est dans <curses.h> et non <ncurses.h>
Commenter la réponse de cmarsc
Messages postés
38
Date d'inscription
jeudi 8 août 2002
Statut
Membre
Dernière intervention
26 août 2004
0
Merci
c bon g trouvé une astuce en mtapant les man en anglais, je met juste halfdelay(1) et j'utilise wgetch
halfdelay permet de parametrer le tps d'attente en dixieme de seconde pour wgetch(et autres cousins de wgetch).
Niko
Commenter la réponse de MasterNKZ
Messages postés
11
Date d'inscription
lundi 24 septembre 2007
Statut
Membre
Dernière intervention
13 mars 2010
0
Merci
[Déterrage]
Merci t'as solution m'a aidé. Cependant, 'haldelay(1)', au lieu de rendre getch totalement non bloquant, introduit un dixième de seconde de temporisation alors que l'on pourrait utiliser simplement 'nodelay'

exemple:
/* curses.h définit TRUE 1 et FALSE 0 */
nodelay (stdscr, TRUE);

-> http://linux.die.net/man/3/halfdelay

a+ collègue manchot ;)
Commenter la réponse de FlorimondH