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

Langage C++ Discussion :

Entrée clavier qui ne bloque pas l'exécution.


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 2
    Par défaut Entrée clavier qui ne bloque pas l'exécution.
    Bonjour à tous,

    Je développe en ce moment une application multi-plateformes en C++ basée sur des évènements et j'ai besoin de programmer une interface utilisateur.

    J'ai deux contraintes :
    - je dois développer ça très vite
    - l'exécution du programme ne doit pas se bloquer pendant que l'utilisateur tape au clavier (le programme reçoit des évènements de diverses sources, pas que de l'utilisateur).

    L'interface doit être très simple : en gros à chaque fois que l'utilisateur appuie sur entrée ça envoie ce qu'il vient de taper à un gestionnaire d'évènements.


    J'aurais aimé savoir s'il existe un moyen simple et portable de faire ceci.
    L'idéal aurait été de pouvoir faire ça avec l'entrée standard ou quelque chose s'en rapprochant (en permettant à l'utilisateur de mettre des trucs dans un buffer pendant que le programme s'exécute et en vérifiant périodiquement le contenu du buffer, ça ne me paraît pas absurde).

    Merci d'avance.




    PS : C'est la première fois que je programme une véritable application en C++ (j'ai fait beaucoup de problèmes de type ACM en C++ et je viens de Python et Ocaml).
    Je travaille essentiellement avec Code::blocks ou à la main sous linux.
    J'utilise GCC (g++) pour compiler et mingw sous windows.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    De portable en C, il y a pdcurses. En C++, je ne sais pas s'il y a autre chose pour les applications console.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    A mon avis, ce que vous espérez est la situation de base, et en fait très difficile (voire impossible) à contourner.
    En effet la question a été posée de faire réagir le programme à la frappe d'une touche, sans appuyer sur "Entrée". On n'y est pas arrivé.
    Les OS actuels (contrairement au DOS) sont basés sur la réaction aux évènements. Tant que l'opérateur n'a pas appuyé sur Entrée, il peut faire tout ce qu'il veut, l'ordinateur vit sa vie de son côté et le programme regarde de temps en temps si la touche Entrée a été appuyée. Pour le forcer à regarder à un moment donné, il faut utiliser la fonction ProcessMessage().
    Cordialement.

    PS Naturellement, il ne faut pas que le programme contienne une fonction du type OnKeyDown(). Si c'est le cas, cette fonction doit être immédiatement suivie du test <Touche Entrée>

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    ^En fait, on y est arrivé depuis longtemps, seulement, pas en 100% portable (et donc, pas en C++ standard non plus).

    D'où la nécessité d'utiliser soit l'API système de la plate-forme, soit une bibliothèque dite "portable" comme pdcurses.

    Et il y a de grandes chances qu'un tel programme doive s'articuler autour d'une boucle d'attente active ou semi-active (faire du polling, quoi).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci pour l'info.
    Cette question a fait l'objet d'un sujet et a été évoqué de nouveau dernièrement.
    Hors bibliothèque supplémentaire, peut-on avoir un bout de code. Merci d'avance.
    En C++, je ne sais pas s'il y a autre chose pour les applications console.
    Je ne comprend pas cette phrase de votre réponse précédente. dark_tangente parle de frappe au clavier et non pas d'application console.

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    Hors bibliothèque supplémentaire, peut-on avoir un bout de code. Merci d'avance.
    Pour quel OS?

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    Je ne comprend pas cette phrase de votre réponse précédente. dark_tangente parle de frappe au clavier et non pas d'application console.
    Le problème ne se présente que dans une application console: Dans une application GUI fenêtrée, le programme ne fait jamais* d'attente de touche bloquante.

    Cela signifie que s'il on peut faire une application GUI plutôt que console (au regard des autres contraintes), il ne faut pas se priver en effet. Et les bibliothèques GUI ne manquent pas: gtkmm, Qt, WxWidgets...

    *Sauf bizarrerie
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Invité
    Invité(e)
    Par défaut
    @Médinoc
    Ok 1 point pour vous.
    @Jean-Marc.Bourget.
    En fait ce problème de saisie sans appuyer su la touche Entrée ne m'intéresse pas personnellement, mais elle a fait l'objet de pas mal d'échanges, et si quelqu'un a un solution je suis sûr que cela intéressera celui qui la cherche.
    Moi, j'ai essayé de trouver sous Windows XP, il y a bien longtemps sous UNIX, mais comme je travaille avec un environnement graphique, en ce qui me concerne, je n'en ai pas besoin.

  9. #9
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 2
    Par défaut
    Tout d'abord, merci pour ces réponses.

    Pdcurses est une possibilité, je vais regarder de plus près.


    Citation Envoyé par Pierre Dolez Voir le message
    Bonjour,
    A mon avis, ce que vous espérez est la situation de base, et en fait très difficile (voire impossible) à contourner.
    En effet la question a été posée de faire réagir le programme à la frappe d'une touche, sans appuyer sur "Entrée". On n'y est pas arrivé.
    Les OS actuels (contrairement au DOS) sont basés sur la réaction aux évènements. Tant que l'opérateur n'a pas appuyé sur Entrée, il peut faire tout ce qu'il veut, l'ordinateur vit sa vie de son côté et le programme regarde de temps en temps si la touche Entrée a été appuyée. Pour le forcer à regarder à un moment donné, il faut utiliser la fonction ProcessMessage().
    Cordialement.

    PS Naturellement, il ne faut pas que le programme contienne une fonction du type OnKeyDown(). Si c'est le cas, cette fonction doit être immédiatement suivie du test <Touche Entrée>
    Et il y a de grandes chances qu'un tel programme doive s'articuler autour d'une boucle d'attente active ou semi-active (faire du polling, quoi).
    Peut-être qu'on s'est mal compris ici.

    Tout d'abord, arrêtez moi si je me trompe :
    lorsque j'écris quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::string bob;
    std::cin >> bob ;
    alors le programme se met en attente (active, passive, peu importe) et lorsque la touche ENTREE est pressée il évalue le contenu de cin et réagit en conséquence.

    Tout ce que je veux dans mon programme c'est l'empêcher de se mettre en attente et inspecter moi-même le contenu de cin de façon périodique à l'aide d'une boucle. La différence c'est que dans mon programme il peut y avoir d'autres évènements que l'appui sur la touche ENTREE (qui n'ont rien à voir avec la console). À chaque tour de boucle j'irais voir si l'utilisateur a appuyé sur ENTREE depuis la dernière fois et j'irais vérifier mes autres sources d'évènements. Mon programme sera aussi en attente, mais pas seulement d'un appui sur ENTREE.
    Le problème c'est qu'à moins qu'on écrive quelque chose comme "cin >>..." (ce qui provoque une attente) alors l'utilisateur ne peut pas écrire dans la console (du moins sous windows).

    Je ne veux pas que mon programme réagisse à la pression des touches ou ce genre de choses.


    J'espère que je suis un peu plus clair sur ce coup là


    PS : j'ai bien conscience que cin ne peut pas faire tout ce que j'évoque plus haut (ou alors si c'est le cas mon problème est résolu). J'ai pris cet exemple pour illustrer la façon dont je voyais les choses.

    PPS :
    Je ne comprend pas cette phrase de votre réponse précédente. dark_tangente parle de frappe au clavier et non pas d'application console.
    En fait je me fiche de réagir à la frappe de chaque touche.
    Je veux juste un moyen simple de récupérer du texte qui s'intègre bien dans ma boucle d'évènements. Passer par la console est probablement la solution la plus simple.

Discussions similaires

  1. problème d'entrée clavier qui ne ressort pas
    Par minimorphee dans le forum Débuter avec Java
    Réponses: 11
    Dernier message: 23/03/2014, 18h19
  2. Temporisation qui ne bloque pas l'application
    Par Zorgloub dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 14/02/2008, 16h55
  3. alert() qui ne bloque pas le chargement de la page ?
    Par Cofondinde dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/08/2007, 10h31
  4. recvfrom qui ne bloque pas ?
    Par innosang dans le forum Réseau
    Réponses: 1
    Dernier message: 21/06/2007, 11h11
  5. Réponses: 8
    Dernier message: 25/11/2005, 18h38

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