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

Discussion :

Redirection de stdout vers un élément graphique

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Etudiant en informatique
    Inscrit en
    Mars 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Etudiant en informatique

    Informations forums :
    Inscription : Mars 2017
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Redirection de stdout vers un élément graphique
    Bonjour,

    Je suis dans un projet déjà bien avancé et un problème se pose.
    Je développe une interface graphique à partir d'une librairie développée par un collègue.

    Dans ses fonctions, il fait des affichage sur la sortie standard.
    Je cherche à récupérer tous les printf de la librairie pour les afficher dans un élément de type QLabel, QPlainTextEdit, ...etc
    J'ai rediriger le flux stdout vers un fichier out.txt. Cette partie là fonctionne (avec un freopen).
    Malheureusement je m'y connais très mal en flux. Mon problème est que je ne sais absolument pas comment afficher le contenu de ce fichier dans mon élément de façon dynamique (en temps réel).
    Je suppose que cela fonctionne un peu comme les pipes en C mais je ne vois pas comment l'adapter ici.

    Merci d'avance

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Si sa bibliothèque en C++, le plus simple serait qu'il écrive dans un flux std::ostream qui serait configurable.
    Ca demande très peu de modification, a priori.
    Une fois fait, tu pourrais créer une classe de flux assez simple qui contient une liste des (derniers) éléments écrits, et qui te permettrait de les lister à volonté.

    Si sa bibliothèque est en C, je ne saurai pas t'aider.

    Sans changement dans la bibliothèque, tu peux chercher les named pipe (linux: mkpipe)
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Une autre piste, qui serait meilleure mais demanderait plus de travail à ton collègue, serait de passer par un framework de log classique, comme log4cpp.

    La encore, une fois que sa bibliothèque sera adaptée, il suffirait de créer une "cible" (appender pour log4cpp) qui écrivent dans le QBidule que tu veux.

    Cela dit, je me pose une question:
    Pourquoi une bibliothèque irait écrire dans le flux standard (voire écrirait tout court).
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Comme dit ci-dessus, idéalement il faudrait que la bibliothèque te laisse configurer dans quel flux écrire ses messages (des logs j'imagine ?).

    Si tu ne peux pas le fonctionnement de la bibliothèque, tu peux surveiller le fichier de sortie out.txt et l'afficher en permanence dans un widget. Pour ça la classe QFileSystemWatcher te sera utile (il faudra relire le fichier intégralement à chaque fois qu'il est modifié, je ne connais pas d'autre technique).

    Dans le même genre tu peux rediriger std::cout dans un ostringstream et ensuite l'afficher dans un widget. Par contre il n'y a pas à ma connaissance d'évènement qui te dise qu'on écrit dans le flux, donc tu aurais besoin d'un QTimer en boucle qui rafraîchisse ton widget avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <sstream>
    #include <iostream>
     
    std::ostringstream strCout;
    std::cout.rdbuf( strCout.rdbuf() );
     
    label->setText(QString::fromStdString(strCout.str())); // À placer dans un slot qui serait appelé régulièrement
    Si enfin tu es dans le cas d'un processus externe à ton appli plutôt que des appels de fonction dans une bibliothèque, sache que QProcess te permet de récupérer la sortie standard du processus exécuté et donc de l'afficher où tu veux.

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Etudiant en informatique
    Inscrit en
    Mars 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Etudiant en informatique

    Informations forums :
    Inscription : Mars 2017
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci à tous pour vos réponses et votre réactivité.

    Mon collègue ne peut malheureusement pas modifier sa librairie pour l'instant.
    Les fonctions de celle-ci comporte des printf, actuellement j'ai juste un fichier que je créé et qui se modifie donc régulièrement avec les sorties de la librairie.

    Je cherche juste un moyen de "connecter" le flux du fichier à un élément graphique pour afficher en temps réel son contenu.

    Je test actuellement avec QFileSystemWatcher.

  6. #6
    Nouveau Candidat au Club
    Femme Profil pro
    Etudiant en informatique
    Inscrit en
    Mars 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Etudiant en informatique

    Informations forums :
    Inscription : Mars 2017
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    QFileSystemWatcher à l'air très intéressant mais je n'arrive pas à faire fonctionner tout ça (le signal fileChanged n'est envoyé qu'une seule fois).

    Je ne peux malheureusement pas me permettre de rester bloquée une journée sur ce problème.
    J'y reviendrai plus tard, si d'autres personnes ont des idées sur comment faire merci d'avance de votre aide.

    Actuellement j'ai tout de même mon fichier que je peux afficher à chaque appel d'une fonction de la librairie.

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/09/2012, 17h24
  2. Réponses: 3
    Dernier message: 08/04/2012, 19h16
  3. Redirection de stdout en C vers Python
    Par makia42 dans le forum PyQt
    Réponses: 11
    Dernier message: 05/04/2011, 21h03
  4. Réponses: 0
    Dernier message: 20/10/2008, 09h47
  5. Réponses: 4
    Dernier message: 16/04/2008, 19h54

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