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

C Discussion :

lecture stdin non bloquante et temps de saisie


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Par défaut lecture stdin non bloquante et temps de saisie
    Bonjour,
    J'aimerais savoir comment peut on effectuer une lecture non bloquante du terminal avec un temps de saisie. Autrement dit j'aimerais tester que l'utilisateur rentre bien un certain mot dans un intervalle de temps donné et ce avec un nombre d'essai que je determinerais.
    Mon problème étant que je connais la synthaxe C mais pas les fonctions/bibliothèques... Et je n'ai rien trouvé sur ce sujet, qui soit comprehensible pour moi....
    D'avance merci

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par TabrisLeFol
    J'aimerais savoir comment peut on effectuer une lecture non bloquante du terminal avec un temps de saisie. Autrement dit j'aimerais tester que l'utilisateur rentre bien un certain mot dans un intervalle de temps donné et ce avec un nombre d'essai que je determinerais.
    Mon problème étant que je connais la synthaxe C mais pas les fonctions/bibliothèques... Et je n'ai rien trouvé sur ce sujet, qui soit comprehensible pour moi....
    Pas de solution standard. Le plus portable est d'utiliser les threads POSIX.1 (pthreads).

    Mais il faut avoir des notion de programmation 'concurrentielle'... Ca te parle ?

    Sinon, il y a d'autres solutions qui dépendent de ton système. Quel est-il ?

  3. #3
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Sous unix, on avait fait ce genre de démo en utilisant les signaux systèmes.

    En gros, tu utilise un handler de signaux et notament un qui verifie un signal d'alarme (de mémoire , SIG_ALRM ). Juste avant ta demande à l'utilisateur tu demande au système de te lancer un signal d'alarme dans un certain laps de temps.

    Si l'utilisateur a fait son entrée, tu demandes au système de ne plus t'envoyer de signal d'alarme.

    Mais comme l'a dit Emmanuel, ça n'est pas standard, il faut absolument faire ce genre de chose en fonction du système cible.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Par défaut
    En effet, j'aurais du préciser. Mon environnement en bien UNIX-like et supporte Posix. Et en effet les signaux me disent quelquechose, même si leur écriture est loin d'être un automatisme pour moi, pour l'instant.

    Pour l'instant, j'utilisais un terminal en mode brut ; lisais les caractères entrés un par un puis testais le temps, le problème restant entier puisque l'appel de la fonction getchar() est bloquante...

    J'y avais pas pensé mais si jamais j'utilise un handler de signal, le processus bloqué sera reveillé et la fonction associé au signal sera éxécuté ? Si c'est bien cela, et cela me semble logique, après réfléxion, cela résoudrait effectivement mon problème.

    Je vais de ce pas essayer.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Par défaut
    Cela fonctionne parfaitement mais c'est loin d'être propre.
    La fonction éxécutée lors de la reception du signal, remet le comportement de reception du signal à default, affiche un message puis fait appel à exit. Ce qui est moyen mais permet de faire un time-over

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Par défaut
    Par contre la lecture n'est toujours pas à proprement parler non bloquante...

  7. #7
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    solution simple: select !

    http://man.developpez.com/man2/select.2.php

    -edit: precisions suite au post d'Emmanue (en dessous)l-

    cela ne fonctionne que sous unix (situation du PO apparement).
    select existe bien sous windows, mais ajouter STDIN_FILENO au FD_SET n'as pas l'effet 'attendu'.

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Dark_Ebola
    Unixoide uniquement... Merci de le préciser...

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Par défaut
    Ok, merci. Je vais regarder. (Même si au premier coup d'oeil, cela me donne mal à la tête... mais bon je suis malade aussi...)

  10. #10
    Membre chevronné Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Par défaut
    En général les pages du manuel du programmeur linux s'adressent... au programmeur linux!
    Cependant et bien que ce ne soit pas la question, l'exemple de la page man select fonctionne sous win en lui ajoutant 5 lignes et une directive pré-processeur.
    Ceci dit les signaux sont également une alternative viable.

  11. #11
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    Citation Envoyé par Lunixinclar
    Cependant et bien que ce ne soit pas la question, l'exemple de la page man select fonctionne sous win en lui ajoutant 5 lignes et une directive pré-processeur.
    là, tu m'interresse
    je ne suis jamais arrivé a faire un select sur le stdin sous windows ... si tu pouvais en dire plus

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

Discussions similaires

  1. lecture non bloquante de clavier
    Par Bayard dans le forum Général Python
    Réponses: 4
    Dernier message: 10/08/2007, 21h27
  2. Lecture non bloquante sur plusieurs Sockets avec nio
    Par ratakses dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 19/04/2007, 16h14
  3. Lecture d'un pipe de façon non-bloquante
    Par Premium dans le forum POSIX
    Réponses: 6
    Dernier message: 31/05/2006, 09h02
  4. Rendre la lecture non bloquante
    Par Charlinecha dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 05/07/2005, 15h46
  5. Réponses: 3
    Dernier message: 16/03/2004, 16h42

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