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

Threads & Processus C++ Discussion :

Thread de lecture d'un pipe et condition d'arrêt


Sujet :

Threads & Processus C++

Vue hybride

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

    Informations forums :
    Inscription : Juillet 2010
    Messages : 21
    Par défaut Thread de lecture d'un pipe et condition d'arrêt
    Bonjour,

    Je m'interroge sur LE moyen de sortir le plus proprement possible d'une boucle de lecture d'un flux avec la fonction ReadFile().

    Dans mon cas, on va dire que j'ai N threads qui lancent chacun un exécutable (CreateProcess()) dont la sortie standard est redirigée vers un pipe. Ces N threads lancent un thread de lecture de ce pipe.

    Comme précisé précédemment, pour lire le contenu du pipe, j'utilise la fonction ReadFile(), sur laquelle je boucle. Je pense ne pas pouvoir sortir de cette boucle en testant la valeur du paramètre DWORD nNumberOfBytesToRead, ni même en appelant PeekNamedPipe() pour tester LPDWORD lpTotalBytesAvail, parce que les exécutables lancés sont différents et il peut se passer plusieurs secondes avant l'écriture dans le pipe.

    J'ai tenté de partager une variable entre chaque paire de threads, sans résultat. En fait, je pensais qu'en passant son adresse en paramètre aux threads enfants, et en la modifiant dans les threads parents une fois que l'exécutable aurait terminé son exécution, je pourrais retrouver ce changement de valeur dans les threads enfants et ainsi pouvoir les arrêter.
    Bizarrement, je capte ce changement de valeur avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while(1)
    {
         if(marqueur == 0)
             break;
    }
    mais pas avec celui-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    while(1)
    {
         if(ReadFile(/* paramètres */))
         {
               /* Traitements */
         }
         if(marqueur == 0)
             break;
    }
    Qu'est-ce que j'ai loupé ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 503

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 21
    Par défaut
    Disons que je continue de rechercher.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 21
    Par défaut
    Citation Envoyé par bacelar Voir le message
    En fait, que j'utilise le mode synchrone ou asynchrone, la fonction ReadFile() ne retourne plus au bout d'un moment.

    Avec le mode synchrone, la fonction ne retournait plus rien, alors que par ailleurs je savais que tout n'avait pas été lu. C'est d'ailleurs pour cette raison que je parvenais pas à vérifier mon changement de valeur (mauvaise solution que j'avais évoqué auparavant).

    Non, vraiment, je suis passé à côté de quelque chose.

    If an anonymous pipe is being used and the write handle has been closed, when ReadFile attempts to read using the pipe's corresponding read handle, the function returns FALSE and GetLastError returns ERROR_BROKEN_PIPE.
    Testé, et ReadFile() n'a pas retourné FALSE.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 21
    Par défaut
    Bonjour,

    Je viens de tester diverses choses, sans succès...
    Si je redirige le flux du pipe dans un fichier, tout le contenu du pipe est lu. En revanche, si je le redirige vers une socket, je ne lis pas tout. J'imagine qu'on pourrait facilement trouver tout cela normal, mais cet aspect me consterne.

    Je vais donc formuler une nouvelle question, que je ne m'étais visiblement pas posée.

    Quel est le bon procédé pour lire dans un pipe en temps réel pendant la complétion de son contenu ?

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 503
    Par défaut
    Primo, vérifiez que votre pipe est mono-directionnel.
    Secondo, à en croire cette discussion http://www.techreplies.com/developme...e-time-723238/, vous êtes bon pour les overlapped I/O.

    Enfin, les pipes, c'est un peu trop old school.
    Sockets ou middlewares orientés messages sont plus simples et plus fiables.

  7. #7
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    <petite parenthèse>
    thread + while(1) == "bad"

    Les conditions de test devrais être dans la condition du while
    </petite parenthèse>

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Enfin, les pipes, c'est un peu trop old school.
    Sockets ou middlewares orientés messages sont plus simples et plus fiables.
    Euh… les sockets plus simples que les pipes, il faut le dire vite, quand même. Et s'ils ne sont pas moins fiables, ils ne le sont pas plus non plus (sous Unix, en tout cas. Sous Windows, je ne saurais dire).

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 204
    Par défaut thread et exécution des méthodes
    Bonjour,

    J'ai une question concernant les thread, les méthodes d'une classe sont exécuté chacune par un thread ou il y a un Thread global qui exécute toutes les méthodes d'une classe ?

    Merci.

  10. #10
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par lionel84 Voir le message
    Bonjour,

    J'ai une question concernant les thread, les méthodes d'une classe sont exécuté chacune par un thread ou il y a un Thread global qui exécute toutes les méthodes d'une classe ?

    Merci.
    Comprends pas la question. Les thread font ce qu'ils veulent. S'ils veulent exécuter des méthodes de classes, il n'y a rien qui les en empêche. Sauf indication contraire, une méthode appelée dans un thread est exécutée dans le contexte de celui-ci.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

Discussions similaires

  1. Condition d'arrêt des boucles
    Par Pingu1 dans le forum MATLAB
    Réponses: 6
    Dernier message: 18/06/2007, 09h19
  2. [TP] Condition d'arrêt = touche escape
    Par gadalla dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 10/05/2007, 13h38
  3. Réponses: 10
    Dernier message: 31/12/2006, 11h16
  4. [VB.NET]Boucle infinie et condition d'arrêt
    Par Benbedo dans le forum Windows Forms
    Réponses: 5
    Dernier message: 31/07/2006, 09h20
  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