Lire un char sans s'arreter [Résolu/Fermé]

Messages postés
98
Date d'inscription
vendredi 4 janvier 2008
Statut
Membre
Dernière intervention
9 janvier 2019
- - Dernière réponse : nagashima
Messages postés
4265
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
29 août 2018
- 22 août 2013 à 14:56
Bonjour,

Mon problème est simple:

Je veux coder une boucle sans fin qui lire un char au clavier mais qui continue en séquence si aucun caractère n'est saisie. Par exemple, imaginer une programme qui code un timer. Le temps s'écoule, mais le programme s'arrête ou remet le timer à zéro lorsqu'une touche est saisi au clavier.

C'est un peu ce que fait getch() (par exemple), sauf que getch() s'arrête en attendant qu'une touche soit saisie, ce que je ne veux pas.

Quelqu'un à une idée?

D'avance merci, Eric.
Afficher la suite 

3 réponses

Messages postés
9701
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
7 juillet 2019
1077
0
Merci
Salut.
ce que tu veux faire, c'est de la programmation événementielle. Ce n'est pas simple à faire. En effet dans ce que tu veux faire, il y a plusieurs taches simultanées, une qui fait un truc et l'autre qui attend que tu entre quelque chose au clavier.
Il y a plusieurs façons de faire. Soit tu débloque le flux d'entrée pour qu'il ne soit plus bloquant, et tu vérifie à chaque itération que rien n'a été entré. Soit tu fais un thread qui stoppera la boucle principale lorsqu'un caractère sera choisi. Ou enfin, tu passe par une bibliothèque, type Qt, qui te permet de faire ça assez facilement.
eric1708
Messages postés
98
Date d'inscription
vendredi 4 janvier 2008
Statut
Membre
Dernière intervention
9 janvier 2019
97 -
Oui, je peux faire ca de manière compliquée, c'est vrai. Mais je suis sûr qu'il y a plus simple à faire. Dans ce que je veux faire, les tâches ne sont pas à faire en simultanées. Je regarde si une touche est entrée au clavier. Si oui, je la traite, si non je continues en séquence. C'est tout. La question est donc d'effectivement trouver un moyen de lire le flux d'entrée sans attente.

D'autres idées?

Eric.
Char Snipeur
Messages postés
9701
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
7 juillet 2019
1077 -
eric1708
Messages postés
98
Date d'inscription
vendredi 4 janvier 2008
Statut
Membre
Dernière intervention
9 janvier 2019
97 -
Ouais, merci. Pas très portable.. Je suis sûr qu'il y a un autre moyen plus "standard" (C-ANSI). Je cherche encore. Si je trouve, je mettrai la solution ici. Si quelqu'un d'autre a une autre solution?

Eric.
Messages postés
98
Date d'inscription
vendredi 4 janvier 2008
Statut
Membre
Dernière intervention
9 janvier 2019
97
0
Merci
Bon, j'ai fini par trouver la réponse. La clef est la fonction kbhit() de conio.h. Voici un exemple de code bidon qui utilise ca:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main(void)
{
   int a,x=0;
   while (1)
   {
        if (kbhit())
        {
                   a=getch();
                   x=0;
        }
            x=x+1;
         if (a == 13) break; /* retour charriot */
         (void)printf("%c %d\n",a,x);
   }
   return 0;
}


Eric.
Char Snipeur
Messages postés
9701
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
7 juillet 2019
1077 -
Et tu parlais de portabilité :-D avec conio, c'est pas gagné... d'après les recherche sur google, il est très spécifique !
eric1708
Messages postés
98
Date d'inscription
vendredi 4 janvier 2008
Statut
Membre
Dernière intervention
9 janvier 2019
97 -
peut-être oui, mais ca compile et ca tourne bien sur tout les compilateurs que je viens de tester. C'est MS-DOS et windows-centré, mais ca me va.

Merci en tout cas pour l'aide.

Eric.
fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1587 -
Alors effectivement, il y a _kbhit() (et non kbhit() qui est obsolète).
Sinon ce n'est clairement pas standard.

Et d'ailleurs il n'y a rien de standard (ni ISO89/90 ni ISO C99).
Pour simuler le comportement de _kbhit(), il faut passer le terminal en mode raw. Donc, à toi de coder le code. Ou utiliser une bibliothèque déjà existante comme Curses. C'est la solution la plus portable...
Char Snipeur
Messages postés
9701
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
7 juillet 2019
1077 -
Oui, mais a priori par portable il veux dire "qui compile sous M$", donc "kbhit" c'est bon...
fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1587 -
Non kbhit() n'est plus bon sous windows, il s'agit de _kbhit(). Cf. MSDN.

donc "kbhit" c'est bon...
J'ai pas dit le contraire (cf. 1ère ligne du dernier post) ... J'ai suggéré une solution "plus" portable (cf. dernière ligne du dernier post) ;-).
Messages postés
4265
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
29 août 2018
159
0
Merci
oy !

plutôt "simple", il faut que tu prenne des cours sur thread/mutex/semaphores histoire de faire tes appli multitâches ( j'ai juste un doute au niveau des bibliothèques entre windows/linux).


Pour commencer =>
http://franckh.developpez.com/tutoriels/posix/pthreads/


le plus difficile étant d'ordonner tes threads, mais vu ce que tu souhaites faire, ca va pas être dur ^^

bne aprem
naga