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 :

Lire l'entrée standard de façon non bloquante ou limitée dans le temps


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 30
    Par défaut Lire l'entrée standard de façon non bloquante ou limitée dans le temps
    Bonjour à tous,

    J'ai un petit problème en C. J'aimerais lire l'entrée standard, de manière à récupérer un charactère, afin de déclencher des événements (menu classique jusque là).

    Cependant, suite à une construction un peu particulière, je dois effectuer cette lecture de manière non bloquante, ou à défaut, pendant un intervalle de temps limité.

    En effet, dans mon programme, j'ai 2 façons de terminer celui ci :
    - recevoir une terminaison locale
    - recevoir un événement réseau indiquant la fin du programme.

    J'ai donc essayer un fgets, mais celui ci bloque le programme tant qu'il n'a pas reçu d'entrée. (Ce qui pose problème, car cela empêche de recevoir des éléments du réseau.)

    J'ai essayé de faire un thread, mais mon thread s'est mis en attente de caractères ... et a oublié de se réveiller quand j'ai tapé sur entrée

    Vu que je suis complètement rouillé en C, je suis un peu à la masse.

    L'objectif est donc de pouvoir permettre à cette boucle d'écouter soit :
    - pjsip_endpt_handle_events(g_endpt, &timeout);
    - stdin, de manière à recevoir un caractère.

    Est ce que quelqu'un aurait une idée ?

    (L'idéal, ce serait un truc portable, mais bon, c'est pas encore noël je crois)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    for (;!g_complete;) {
    		pj_time_val timeout = {0, 10};
    		pjsip_endpt_handle_events(g_endpt, &timeout);
    		char option[10];
    		puts("Press 'h' to hangup during communication or 'q' to quit");
    		fgets(option, sizeof(option), stdin);
     
     
    		if (option[0] == 'q') {
    			break;
    		}
                    ...
    }
    Merci pour votre aide,

    Museum

  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
    Il n'y a rien de portable, et c'est PITA sous Windows à cause d'un bug au niveau de la gestion des consoles.

    À une époque, j'avais triché en faisant un ReadConsole() sur un handle dupliqué (avec DuplicateHandle()) vers l'entrée standard, et je fermais ce handle dupliqué dans un autre thread.
    ReadConsole() retournait une erreur ERROR_INVALID_HANDLE, et je reprenais l'exécution.

    Mais cela dépend entièrement de comportements non-documentés et n'est pas garanti marcher sur toutes les versions de Windows.
    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
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 30
    Par défaut
    C'est bien ce que je craignais.

    Bon, je vais donc enterrer la portabilité et me rappeler comment on capture les signaux de la commande kill.

    Et un deuxieme process s'occupera de les envoyer

    Merci pour tout.

  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
    Euh, en POSIX, tu peux essayer la fonction alarm() pour commencer: Elle envoie un signal SIGALRM quand le temps est écoulé...
    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
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 30
    Par défaut
    à vrai dire, envoyer les signaux n'est pas le problème. Un petit script bash et la commande kill sont là pour ca.

    Non, ce qu'il faut que je retrouve, c'est comment les capturer.

    Mais bon, google est là pour moi

    Merci pour tout

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

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Museum Voir le message
    à vrai dire, envoyer les signaux n'est pas le problème. Un petit script bash et la commande kill sont là pour ca.

    Non, ce qu'il faut que je retrouve, c'est comment les capturer.

    Mais bon, google est là pour moi

    Merci pour tout
    sigaction() est fait pour, mais je préfère de loin la méthode select().

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

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Pour le coup, un select() couplé à l'entrée standard passé en mode asynchrone me paraît plus approprié.

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

Discussions similaires

  1. Différence entre Asynchrone et modèle non bloquant
    Par unoomad dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 16/05/2014, 14h02
  2. entrée au clavier non bloquante
    Par Z20500 dans le forum Général Python
    Réponses: 3
    Dernier message: 21/07/2009, 10h34
  3. Réponses: 23
    Dernier message: 02/04/2008, 15h39
  4. Contourner le non-support de limit dans une sous-requête
    Par Christophe Charron dans le forum Requêtes
    Réponses: 7
    Dernier message: 04/09/2007, 10h45
  5. Lecture d'un pipe de façon non-bloquante
    Par Premium dans le forum POSIX
    Réponses: 6
    Dernier message: 31/05/2006, 09h02

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