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 :

Lancement de QProcess inopérant


Sujet :

Qt

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Passioné
    Inscrit en
    Mars 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Passioné

    Informations forums :
    Inscription : Mars 2018
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Lancement de QProcess inopérant
    Bonjour,

    J'ai un soucis sous Windows.

    J'ai paramétré un raccourci pour lancer un QProcess depuis mon application principale, il permet de lancer une application externe qui enregistre des paramètres. (Volonté que le module de configuration ne soit pas directement accessible à l'utilisateur - via un menu ou un bouton par exemple).

    Je procède au déploiement de mon application via Inno Setup, pas de soucis, tout fonctionne de ce coté.

    De ce fait, je connais par avance le chemin de l'exécutable, que je récupère via un QStandardPaths.

    En voyant que mon raccourci ne fonctionnait pas, j'ai loggé des messages dans un fichier : le chemin de l'exécutable à lancer est le bon, mais le QProcess ne se lance pas.

    Est-ce lié au fait qu'il se trouve dans "C:\Program Files (x86)\..." ? et s'il s'agit de cela, comment résoudre mon problème ?

    Voici le code qui crée le raccourci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        QShortcut *shrtcutLaunchConf = new QShortcut(tr("Ctrl+Shift+C"), this);
        //Connections
        connect(shrtcutLaunchConf, SIGNAL(activated()), this, SLOT(openConfig()));
    et celui qui appelle le QProcess :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void EmWindow::openConfig()
    {
        QProcess *config = new QProcess();
        QString programmPath = QStandardPaths::locate(QStandardPaths::AppDataLocation, "", QStandardPaths::LocateDirectory);
        programmPath +="emConf.exe";
    logMessage("[openconfig()] programmPath set to :");
    logMessage(programmPath);
         config->start(programmPath);
    }

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    Bonjour,

    QProcess fourni les signaux void errorOccurred(QProcess::ProcessError error) qui permet de récupérer les erreurs éventuelles durant l'exécution ainsi que void finished(int exitCode, QProcess::ExitStatus exitStatus) émis lorsque le process se termine. En se connectant à ces signaux cela devrait vous aider à déterminer la cause du problème.

    Autre chose, votre code actuel génère des fuites de mémoire. Lors de la création d'un nouvel objet avec l'appel de new il faut s'assurer que l'objet sera bien détruit après son utilisation. Grâce au système de parent-enfant de Qt (Object Trees & Ownership), on peut s'assurer de libérer la mémoire en passant le parent (this) lors de l'appel du constructeur: QProcess *config = new QProcess(this);.

    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
    void EmWindow::openConfig()
    {    
        QProcess *config = new QProcess(this);
        QString programmPath = QStandardPaths::locate(QStandardPaths::AppDataLocation, "", QStandardPaths::LocateDirectory);
        programmPath +="emConf.exe";
        logMessage("[openconfig()] programmPath set to :");
        logMessage(programmPath);
     
        connect(config, &QProcess::errorOccured, this, &EmWindow::onErrorOccured);
        connect(config, &QProcess::finished, this, &EmWindow::onFinished);
        config->start(programmPath);
    }
     
    void EmWindow::onErrorOccurred(QProcess::ProcessError error)
    {
         logMessage(QString"[onErrorOccurred()] Error : %1").arg(error);
    }
     
    void EmWindow::onFinished(int exitCode, QProcess::ExitStatus exitStatus)
    {
        logMessage(QString"[onFinished()] Exit code: %1  Exit status: %2").arg(exitCode).arg(exitStatus);
        QProcess *p = qobject_cast<QProcess*>(sender());
        if(p)
            p->deleteLater(); //Une autre façon de s'assurer que la mémoire sera libérée. 
    }

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Passioné
    Inscrit en
    Mars 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Passioné

    Informations forums :
    Inscription : Mars 2018
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Merci @Gojir4 pour ta réponse et tes conseils.

    Du coup je l'ai mise en place et il s'avère que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [onErrorOccurred()] Error : 0
    A la lecture de la doc je crois comprendre que le processus se termine "normalement".

    Du coup je reste dans l'incompréhension. Lancé indépendamment, tout se passe bien pourtant.

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    D'après votre log (si il est complet) il semble que "onFinished" n'est jamais appelé, ce qui voudrait dire que le processus ne s'est pas terminé.

    Sinon il faut s'assurer que le chemin d'appel est bien correct. Il est possible que quelque chose soit différent lors d'un lancement "manuel" de la commande.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Passioné
    Inscrit en
    Mars 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Passioné

    Informations forums :
    Inscription : Mars 2018
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Voici le log "complet" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    [openconfig()] programmPath set to :
    C:/Program Files (x86)/escapeMeApp/emConf.exe
    [onErrorOccurred()] Error : 0
    ...ce qui correspond bien à l'emplacement exact de l'exécutable.
    A supposer qu'il se lance mais ne se termine pas, je ne trouve aucunement sa trace dans le gestionnaire de tâches, rien de spécial dans les journaux non plus :/

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    En en essayant avec le chemin dans le format "Windows" (remplacement des "/" par des "\") ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void EmWindow::openConfig()
    {    
        QProcess *config = new QProcess(this);
        QString programmPath = QStandardPaths::locate(QStandardPaths::AppDataLocation, "", QStandardPaths::LocateDirectory);
        programmPath +="emConf.exe";
        //Conversion du chemin dans le format de la plateforme courante
        programmPath = QDir::toNativeSeparators(programmPath);
        logMessage("[openconfig()] programmPath set to :");
        logMessage(programmPath);
     
        connect(config, &QProcess::errorOccured, this, &EmWindow::onErrorOccured);
        connect(config, &QProcess::finished, this, &EmWindow::onFinished);
        config->start(programmPath);
    }

  7. #7
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    D'après la doc de QProcess
    "The QProcess object will immediately enter the Starting state. If the process starts successfully, QProcess will emit started(); otherwise, errorOccurred() will be emitted."

    Donc il semblerait que le process n'as jamais été démarré, ce qui pourrait coller avec le problème de chemin utilisant des slash ("/")
    Vous pouvez connecter le signal started() afin d'en avoir la certitude, mais je présume qu'il ne sera pas appelé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(config, &QProcess::started, this, &EmWindow::onProcessStarted);

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Passioné
    Inscrit en
    Mars 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Passioné

    Informations forums :
    Inscription : Mars 2018
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Merci de te pencher sur mon problème.

    Le processus ne se lance toujours pas, voici le log :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [openconfig()] programmPath set to : C:\Program Files (x86)\escapeMeApp\emConf.exe
    [onErrorOccurred()] Error : 0
    Effectivement il est plus cohérent d'avoir un chemin dans le format windows, c'est fait

    J'ai mis à jour mon code, le voici :

    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
    26
    27
    28
    29
    30
    void EmWindow::openConfig()
    {
        QProcess *config = new QProcess(this);
        QString programmPath = QStandardPaths::locate(QStandardPaths::AppDataLocation, "", QStandardPaths::LocateDirectory);
        programmPath +="emConf.exe";
        //Conversion du chemin dans le format de la plateforme courante
        programmPath = QDir::toNativeSeparators(programmPath);
    logMessage(QString("[openconfig()] programmPath set to : %1").arg(programmPath));
        connect(config, SIGNAL(started(QProcess::ProcessState)), this, SLOT(EmWindow::onProcessStarted(QProcess::ProcessState)));
        connect(config, SIGNAL(errorOccurred(QProcess::ProcessError)) , this, SLOT(onErrorOccurred(QProcess::ProcessError)));
        connect(config, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(onFinished(int,QProcess::ExitStatus)));
        config->start(programmPath);
    }
    void EmWindow::onProcessStarted(QProcess::ProcessState state)
    {
        logMessage(QString("[onProcessStarted()] - Etat %1").arg(state));
    }
     
    void EmWindow::onErrorOccurred(QProcess::ProcessError error)
    {
         logMessage(QString("[onErrorOccurred()] Error : %1").arg(error));
    }
     
    void EmWindow::onFinished(int exitCode, QProcess::ExitStatus exitStatus)
    {
        logMessage(QString("[onFinished()] Exit code: %1  Exit status: %2").arg(exitCode).arg(exitStatus));
        QProcess *p = qobject_cast<QProcess*>(sender());
        if(p)
            p->deleteLater(); //Une autre façon de s'assurer que la mémoire sera libérée.
    }
    Au cas où, le raccourci que j'ai choisi (Ctrl-Maj-C) soit en conflit avec un autre raccourci, quelque part, ailleurs, j'ai essayé avec un nouveau raccourci (Ctrl-Maj-G). Ce qui reste sans effets. Mais de toutes façons le raccourci est bien capturé puisque openConfig() est appelé.

    A tous hasards, le problème vient peut-être d'une autre partie du code. Il est disponible en entier ici :
    https://github.com/zobrak/escapeme

    (Pas tapper pas tapper ! J'en profite pour dire que mon code ne doit pas être très "propre", bien qu'l fonctionne, et je suis preneur de tous conseils pour l'améliorer et mieux l'organiser bien sur !)

Discussions similaires

  1. Réponses: 8
    Dernier message: 06/10/2010, 10h45
  2. [Kylix] Erreur au lancement de K3 en open C++
    Par Glouferu dans le forum EDI
    Réponses: 9
    Dernier message: 14/03/2003, 16h27
  3. Réponses: 1
    Dernier message: 13/01/2003, 09h26
  4. [Kylix] PB au lancement
    Par sebounator dans le forum EDI
    Réponses: 3
    Dernier message: 09/01/2003, 12h10
  5. Réponses: 2
    Dernier message: 22/07/2002, 12h13

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