IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Fonction Kbhit() pour arret de boucle infinie


Sujet :

Linux

  1. #1
    Membre régulier
    Inscrit en
    Février 2008
    Messages
    302
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 302
    Points : 78
    Points
    78
    Par défaut Fonction Kbhit() pour arret de boucle infinie
    Bonjour alors voila ... J'ai réalisé une application sous Windows (qui fonctionne) qui utilise la fonction kbhit ... j'utilise cette fonction enfait pour pouvoir arreter une boucle infinie.
    de la facon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      while(!quit){
     
        if(kbhit()) out_char = getch();
        if(out_char == 27) quit = true;
      }
    Maintenant je dois aussi faire tourner ce code sous linux ... Comme la fonction kbhit ne se trouve pas sous linux, j'ai trouvé dans les FAQ de developpez.net une fonction qui permettait d'avoir le même comportement que kbhit() sous windows.
    Voici quand même le code si jamais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <unistd.h>
    #include <sys/time.h>
     
    int unix_kbhit(void)
    {
       struct timeval tv = { 0, 0 };
       fd_set readfds;
     
       FD_ZERO(&readfds);
       FD_SET(STDIN_FILENO, &readfds);
     
       return select(STDIN_FILENO + 1, &readfds, NULL, NULL, &tv) == 1;
    }
    et pour pouvoir utiliser cette fonction j'ai bien lu qu'il fallait placer la console en mode raw, ce que j'ai fais avec le code juste trouvé en dessous du code pour simuler la fonction kbhit():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    #include <termios.h>
    #include <unistd.h>
     
    void mode_raw(int activer)
    {
       static struct termios cooked;
       static int raw_actif = 0;
     
       if (raw_actif == activer)
       {
          return;
       }
     
       if (activer)
       {
          struct termios raw;
     
          tcgetattr(STDIN_FILENO, &cooked);
     
          raw = cooked;
          cfmakeraw(&raw);
          tcsetattr(STDIN_FILENO, TCSANOW, &raw);
     
       }
       else
       {
          tcsetattr(STDIN_FILENO, TCSANOW, &cooked);
       }
     
       raw_actif = activer;
    }
    Et donc j'ai changé la boucle infinie pour etre compatible avec linux puisque la fonction getch n'existe pas non plus ... Donc pour pouvoir l'utiliser, j'ai trouvé la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int getch(){
      char ch;
      read(0,&ch,1);
      return ch;
    }

    Une fois tout mis en place, et que je lance le programme, celui ci a un comportement assez bizzar, du faite que les printf réalisé s'écrive en diagonale... Et je n'ai pas l'impression que cela fonctionne aussi bien que sous windows (il ne detecte pas spécialement que j'appuie sur echap pour pouvoir arreter la boucle principale) ....

    Auriez vous une idée sur le probleme ?


    merci

  2. #2
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Utilise PDCurses, bien plus puissant, fonctionne sous Windows, Unix et Mac.
    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. fonction colon pour cell (sans boucle for)
    Par soft001 dans le forum MATLAB
    Réponses: 1
    Dernier message: 11/09/2011, 13h11
  2. programmer un bouton pour arreter une boucle
    Par yassine.khe dans le forum Débuter
    Réponses: 2
    Dernier message: 25/05/2009, 10h59
  3. Instruction pour arreter une boucle infinie
    Par pitizone dans le forum MATLAB
    Réponses: 2
    Dernier message: 22/03/2007, 14h42
  4. [JMeter] Problème avec la boucle infinie pour les tests
    Par zegreg dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 05/10/2005, 11h41
  5. [Boucle Infinie] pour un menu
    Par NhyMbuS dans le forum C++
    Réponses: 5
    Dernier message: 20/07/2005, 09h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo