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

Qt Discussion :

[Qt4]Lire ce que retourne un programme lancé avec qprocess


Sujet :

Qt

  1. #1
    Expert éminent
    Avatar de Michaël
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    3 497
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2003
    Messages : 3 497
    Points : 8 237
    Points
    8 237
    Par défaut [Qt4]Lire ce que retourne un programme lancé avec qprocess
    bonjour,
    je voudrais lancer un programme et lire ce que retourne ce programme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    QProcess builder;
    //lancement du programme externe
    builder.startDetached("build_fps", QStringList() << this->edit_xml->text() << this->edit_src->text() << this->edit_fps->text() << preferences::self()->dirs_build);
    //affichage d'une fenêtre qui doit recevoir le texte
    OutputWin::self()->show();
    //écriture du texte de sortie du programme
    OutputWin::self()->text_console->setText(builder.readAll());
    je lance mon programme dans la console puis j'essaie de lancer le programme externe avec le code ci-dessus. le programme externe se lance très bien, affiche plein de choses dans la console mais rien n'est renvoyé dans ma fenêtre


    il y a quelque chose que je fais mal ?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Points : 93
    Points
    93
    Par défaut
    Qu'est-ce que ce programme externe "build_fps" ? Affiche-t-il sur stdout ou directement dans la console ?

  3. #3
    Expert éminent
    Avatar de Michaël
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    3 497
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2003
    Messages : 3 497
    Points : 8 237
    Points
    8 237
    Par défaut
    le programme build_fps est en fait un script bash qui écrit sur la console via echo.


    j'ai essayé de faire une fonction slot connectée aux signaux readyReadStandardError et readyReadStandardOutput. mon slot se lance bien mais rien n'est lu

    j'ai oublié de dire que j'étais sous linux

  4. #4
    Nouveau membre du Club Avatar de minirop
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 58
    Points : 36
    Points
    36
    Par défaut
    et en mettant "./build_fps" ?
    Envoyez des données et des fichiers en POST avec Qt : SendForm

  5. #5
    Expert éminent
    Avatar de Michaël
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    3 497
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2003
    Messages : 3 497
    Points : 8 237
    Points
    8 237
    Par défaut
    si je mets ./build_fps, le programme ne se lance plus du tout : il faudrait que je soit dans le répertoire où est build_fps, ce qui n'est pas le cas. je voudrais éviter de me placer dans un répertoire précis, ce qui "figerait" l'application

  6. #6
    Expert éminent
    Avatar de Michaël
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    3 497
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2003
    Messages : 3 497
    Points : 8 237
    Points
    8 237
    Par défaut
    j'ai un peu avancé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    QProcess builder;
    builder.setReadChannelMode(QProcess::MergedChannels);
    //builder.start("build_fps", QStringList() << this->edit_xml->text() << this->edit_src->text() << this->edit_fps->text() << preferences::self()->dirs_build);
    builder.start("ls", QStringList() << "-l" << "/");
    OutputWin::self()->show();
    if (!builder.waitForFinished())
        OutputWin::self()->text_console->setText(builder.errorString());
    else
        OutputWin::self()->text_console->setText(builder.readAll());
    pour le ls -l /, ça marche, ça s'affiche dans ma fenêtre. en revanche, quand je change la ligne builder.start (pour prendre celle qui est commentée au dessus), ça me dit quelque chose dans le goût
    Process timed out
    et mon process continue sa petite vie en arrière plan

    bref, ça commence à devenir bon mais pas assez le problème de cette méthode est que ça attend que le process soit fini pour afficher des choses. mon programme externe prend pas mal de temps (le programme fait de la compilation) donc si j'arrive à résoudre le problème de timeout, ça risque de mettre longtemps à s'afficher

    une idée ?

  7. #7
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    La sortie de ton QProcess, tu peux la récupérer quand le process a fini avec un signal, non ?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Points : 93
    Points
    93
    Par défaut
    Citation Envoyé par Michaël
    bref, ça commence à devenir bon mais pas assez le problème de cette méthode est que ça attend que le process soit fini pour afficher des choses. mon programme externe prend pas mal de temps (le programme fait de la compilation) donc si j'arrive à résoudre le problème de timeout, ça risque de mettre longtemps à s'afficher
    Effectivement, certaines fonctions de QProcess sont bloquantes :
    QProcess provides a set of functions which allow it to be used without an event loop, by suspending the calling thread until certain signals are emitted:Calling these functions from the main thread (the thread that calls QApplication::exec()) may cause your user interface to freeze.
    La solution est d'utiliser les fonctions non bloquantes de QProcess, et d'utiliser les signaux de QProcess pour lire la sortie standard du programme au fur et à mesure.

  9. #9
    Expert éminent
    Avatar de Michaël
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    3 497
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2003
    Messages : 3 497
    Points : 8 237
    Points
    8 237
    Par défaut
    c'est bon j'ai réussi
    j'ai créé un slot nommé output() qui se charge d'écrire les messages dans ma fenêtre. voici le code (à optimiser)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    QProcess mProcess; 
    //constructeur de classe
    Nouveau::Nouveau( QWidget* parent )
        : QDialog( parent )
    {
     
        setupUi( this );
        connect(&mProcess,SIGNAL( readyReadStandardOutput () ),this,SLOT(output() ) );
        connect(&mProcess,SIGNAL( readyReadStandardError () ),this,SLOT(output() ) );
    }
     
    void Nouveau::output()
        {
        qDebug("output");
       //concaténation du contenu de la console et du message de sortie du programme externe OutputWin::self()->text_console->setText(OutputWin::self()->text_console->toPlainText()+mProcess.readAllStandardOutput ());
        }
     
     
    //fonction qui appelle le programme
    void Nouveau::prepareBuild()
        {
        mProcess.setReadChannelMode(QProcess::MergedChannels);
        mProcess.start("build_fps", QStringList() << this->edit_xml->text() << this->edit_src->text() << this->edit_fps->text() << preferences::self()->dirs_build);
        OutputWin::self()->show();
        }
    le message de sortie du programme s'affiche correctement dans la fenêtre au fur et à mesure et sans timeout

    merci à tous ceux qui m'ont aidé

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

Discussions similaires

  1. [WM16] Arret d'un programme lancé avec "ceLanceAppli"
    Par courdi95 dans le forum Windev Mobile
    Réponses: 0
    Dernier message: 20/12/2011, 16h12
  2. Réponses: 6
    Dernier message: 27/03/2009, 13h16
  3. Réponses: 1
    Dernier message: 21/10/2006, 09h29
  4. programmes lances au demarrage
    Par d-a-v-e dans le forum Autres Logiciels
    Réponses: 14
    Dernier message: 28/02/2006, 16h15
  5. Que fait ce programme ?
    Par babar56 dans le forum C
    Réponses: 32
    Dernier message: 16/01/2006, 21h31

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