Lire un char sans s'arreter

Résolu
eric1708 Messages postés 101 Date d'inscription   Statut Membre Dernière intervention   -  
 Utilisateur anonyme -
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.
A voir également:

3 réponses

Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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.
0
eric1708 Messages postés 101 Date d'inscription   Statut Membre Dernière intervention   128
 
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.
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
0
eric1708 Messages postés 101 Date d'inscription   Statut Membre Dernière intervention   128
 
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.
0
eric1708 Messages postés 101 Date d'inscription   Statut Membre Dernière intervention   128
 
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.
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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 !
0
eric1708 Messages postés 101 Date d'inscription   Statut Membre Dernière intervention   128
 
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.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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...
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Oui, mais a priori par portable il veux dire "qui compile sous M$", donc "kbhit" c'est bon...
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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) ;-).
0
Utilisateur anonyme
 
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 =>
https://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
0