Forum Programmation.c++ Quitter le programme en appuyant sur une touche

Posté par  .
Étiquettes : aucune
0
17
déc.
2004
Bonjour,
Voila tout est dans le titre, j'aimerai que lorsque l'utilisateur appuie sur la touche space, cela quitte ma boucle while par exemple, ou que cela quitte mon programme.

J'ai essayé avec un getchar(); mais je ne vois pas trop comment m'y prendre.
Merci.
  • # Ncurses

    Posté par  . Évalué à 3.

    Si c'est en mode texte, tu peux utiliser ncurses pour ça. Un petit man getch devrait t'amener un peu plus loin.
  • # pistes...

    Posté par  . Évalué à 1.

    Deux pistes (modestement):
    char c = getchar();
    if(c == ' ')
    exit(0)


    ou dans une boucle:
    char c;
    while(1) /* la condition qui va bien */
    {
    //...
    c = getchar();
    if(c == ' ')
    break;
    //...
    }
    • [^] # Re: pistes...

      Posté par  . Évalué à 5.

      Ca c'est pas une bonne idee car la boucle va bloquer sur le getchar en attendant qu'une touche soit pressee.

      Il y a possibilite d'utiliser la lib ncurses en specifiant un half-delay mais c'est un peu limite car il faut specifier un timeout en dixiemes de secondes, bref l'appel bloquera pendant au minimum 1 dixieme a chaque fois et dans une boucle c'est un ralentissement enorme, sinon il y a nodelay qui retourne tout de suite.

      Une methode plus propre serait :
      2 threads, un qui surveille le clavier pendant que l'autre fait le loop. Lorsque le thread qui surveille le clavier detecte un keypress, il signale l'autre thread(soit en envoyant un signal, soit en mettant une variable commune a une certaine valeur, variable qui est testee a plusieurs endroits dans le soft) qui des lors fait ce qu'il faut(cleanup & sortie).

      De cette maniere le thread de calcul ne fait que ca, du calcul et n'a pas a se soucier d'entrees/sorties, et l'autre thread ne fait que gerer les entrees/sorties, je trouves cela plus "clean" comme methode. Si tu veux changer la methode pour stopper le soft(passer d'un key press a un packet recu sur un socket ou autre par exemple), t'as qu'a changer le code du thread de surveillance, pas besoin de toucher le code de calcul.
    • [^] # Re: pistes...

      Posté par  (site web personnel) . Évalué à 2.

      bon alors quand meme deux trois trucs a rajouter :)
      Faut faire un fcntl pour passer en non bloquant
      Et aussi faire un ioctl sur le tty pour dire de ne pas attendre le \n pour envoyer les données (mode canon et/ou echo je sais plus exactement)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.