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 :

QProcess et waitForFinished


Sujet :

Qt

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 198
    Points : 101
    Points
    101
    Par défaut QProcess et waitForFinished
    Bonjour,

    Je lance un sous-programme par QProcess et je veux attendre sa fin pour récupérer ses sorties. Pour cela j'utilise la méthode waitForFinished() avec l'argument "-1" pour attendre la fin d'exécution et continuer mon programme. Mais après le start() le programme me rend immédiatement la main !?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
           QProcess compilation;
           qDebug() << "Lancement " << jobname ;
           compilation.start("ss-pgm.exe", args);
           compilation.waitForFinished(-1);
           qDebug() << "Arrêt " << jobname ;
           QByteArray SortieStd = compilation.readAllStandardOutput();
           QByteArray SortieErr = compilation.readAllStandardError();

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 38
    Points : 45
    Points
    45
    Par défaut
    Salut,

    Je commence justement en ce moment à me mettre dans les QProcess, et entres autres je suis tombé sur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int QProcess::execute ( const QString & program, const QStringList & arguments ) [static]
    Qui pourrait peut-être te convenir.

    Sinon connecte le signal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void	finished ( int exitCode, QProcess::ExitStatus exitStatus )
    à une autre fonction pour qu'elle soit exécutée à la fin du process.

    Dernière solution que je peux proposer, dès que le QProcess est près à la lecture tu commences à le lire, tu peux le savoir par ce signal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void	readyReadStandardOutput ()
    En espérant avoir aidé, car comme je l'ai dit je commence à m'y mettre donc je ne maitrise pas le sujet sur le bout des doigts .

    G.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 198
    Points : 101
    Points
    101
    Par défaut
    Utiliser execute ne modifie pas le comportement de mon programme.

    Je ne peut pas utiliser de signal par ce que je suis dans un boucle infinie, je lance un certain nombre de fois le sous-programme avec des paramètres différent.

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    If msecs is -1, this function will not time out.
    donc -1 risque pas de bloquer.

    Une autre solution est de faire une eventloop locale
    http://qt-quarterly.developpez.com/q...ivite-ihm/#LIV

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 198
    Points : 101
    Points
    101
    Par défaut
    Je vais plutôt utiliser QProcess::execute().
    Mais ce qui est bizarre c'est que quelle que soit la méthode de QProcess utilisée, ça mets fin au thread qui contient cet appel, le code qui suit n'est pas exécuté ??

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 38
    Points : 45
    Points
    45
    Par défaut
    Bizarre,

    En relisant la doc c'est vrai que le waitForFinished devrait bien attendre la fin du process, d'ailleurs ils préviennent "Warning: Calling this function from the main (GUI) thread might cause your user interface to freeze.", donc s'il y a un problème le pire que tu aurais en passant -1 en paramètre c'est que ton application freeze. Ce qui m'a fait penser à une chose: essaye de vérifier juste après ton start qu'il n'y a pas une erreur avec un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (compilation.error() == QProcess::FailedToStart)
    {
        qDebug() << "compilation process failed to start.";
    }
    Si c'est le cas c'est qu'il y a un problème avec ton appel, peut-être vérifier avec la fonction environment() et éventuellement faire un setEnvironment ( const QStringList & environment ) en ajoutant le path qui va bien, voici un extrait de la doc:
    For example, the following code adds the C:\\BIN directory to the list of executable paths (PATHS) on Windows:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    QProcess process;
    QStringList env = QProcess::systemEnvironment();
    env << "TMPDIR=C:\\MyApp\\temp"; // Add an environment variable
    env.replaceInStrings(QRegExp("^PATH=(.*)", Qt::CaseInsensitive), "PATH=\\1;C:\\Bin");
    process.setEnvironment(env);
    process.start("myapp");
    G.

    @yan: passer -1 en paramètre ne tombe pas en time out mais attend quand même le signal finish() du process si j'ai bien compris, donc pour moi devrais bloquer tant que ce signal n'est pas reçu.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 198
    Points : 101
    Points
    101
    Par défaut
    waitForFinished(-1) fonctionne, c'est le thread encapsulant cette partie de code qui avait un problème.

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

Discussions similaires

  1. [macOS] QProcess et waitForFinished()
    Par phm5519 dans le forum Plateformes
    Réponses: 1
    Dernier message: 17/03/2010, 09h26
  2. [Linux-Qt4.4]QProcess ne se termine pas!
    Par crtx_omar dans le forum Qt
    Réponses: 2
    Dernier message: 27/08/2008, 10h28
  3. Exemple QProcess FAQ: aide compréhension
    Par Nykoo dans le forum Qt
    Réponses: 9
    Dernier message: 01/04/2008, 00h28
  4. [QThread] QProcess et QSemaphore
    Par slymira dans le forum Multithreading
    Réponses: 11
    Dernier message: 29/11/2007, 11h40
  5. Réponses: 8
    Dernier message: 21/12/2006, 21h03

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