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 :

QProcess : fermer toutes les processus ouverts

  1. #1
    Membre du Club
    Femme Profil pro
    Apprentie Développeuse
    Inscrit en
    Février 2013
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Apprentie Développeuse
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 106
    Points : 44
    Points
    44
    Par défaut QProcess : fermer toutes les processus ouverts
    Bonjour ,

    j'ai une application composé d'une classe principale MAINWINDOWS et d'une autre classe appelée FENETRE

    ma MAINWINDOWS appel ma classe FENETRE et dans cette classe on ouvre différent programme externe

    J'aimerais que lorsque l'on clique sur le bouton quitter de la MAINWINDOW tous les processus se ferment.

    j'ai testé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void MainWindow::quitter(){
        qApp->quit();
     
        fen->process_Site->terminate(); // ça ne coupe pas le process 
    fen->process_Site->kill(); // ne fonctionne pas non plus
     }
    je lance mon process comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    QString chemin  = "C:/Notepad++/notepad++.exe";
    process_fen->startDetached(chemin);
    j'ai essayé avec la méthode start() mais ayant process_fen différents (en fonction de certaines boucles) ça ne fonctionne pas car je veux lancer plusieurs app externe , seul un process se lance mais quand j'appuie sur le bouton tout se ferme sauf l'appli externe. Alors que start est sur le même process que l"appli en elle même normalement ..

    J'ai pensé au PID mais je sais pas ..

    Merci par avance par l'aide , je suis un peu bloquée

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    J'imagine que la classe que vous utilisez pour lancer un nouveau processus permet aussi de l'arrêter.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre du Club
    Femme Profil pro
    Apprentie Développeuse
    Inscrit en
    Février 2013
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Apprentie Développeuse
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 106
    Points : 44
    Points
    44
    Par défaut
    Bonjour ,

    non ce n'est pas cette classe qui l'arrête je veux que ce soit ma mainwindows qui l'arrête quand on clique sur quitter

    Dans ma classe fen j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     QList<Q_PID> listeProcess;
     
    inline QList<Q_PID> fen::get_ListeProcess_str(){
        return listeProcess;
    }
    inline void fen:: set_ListeProcess_str(QList<Q_PID> process){
        listeProcess = process;
    }
    dans mon fen.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      processstartDetached(nom
                //Q_PID* pid = process_Site->pid();
     
                listeProcess.append(process->pid());
    et dans ma mainwindows :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void MainWindow::quitter(){
        QList<Q_PID> liste;
    liste = fen->get_ListeProcess_str();
    while(liste.count() != 0){
         QMessageBox::warning(this, "Fermeture application", "veuillez fermer toutes les fen");
    }    
      }
    mais ça ne fonctionne pas mon appli plante !
    merci par avance pour l'aide

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    mais ça ne fonctionne pas mon appli plante !
    Utilisez le débogueur pour comprendre où et pourquoi.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre du Club
    Femme Profil pro
    Apprentie Développeuse
    Inscrit en
    Février 2013
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Apprentie Développeuse
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 106
    Points : 44
    Points
    44
    Par défaut
    J'ai avancé !

    J'ai maintenant une liste de tous mes PID lancés , et j'arrive à récupérer tous les process qui tournent mais j'essaie de trouver leur PID et comparer si ça existe pour faire un kill de chaque mais je rame un petit peu ..
    j'aimerais bien un peu d'aide svp

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Comme votre programme connait les programmes que vous lancez, pas besoin d'avoir une liste de tous les PID du système. Juste, il suffit de récupérer le PID du programme que vous lancez. J'ose croire que QProcess est capable de le faire, si vous lancez vos programmes avec QProcess. Sinon, montrez nous comment vous lancez vos programmes.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Membre du Club
    Femme Profil pro
    Apprentie Développeuse
    Inscrit en
    Février 2013
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Apprentie Développeuse
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 106
    Points : 44
    Points
    44
    Par défaut
    Merci de votre réponse c'est gentil

    je lance mes programmes avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    process_fen->startDetached(chemin);
    Mais comme c'est startDetached je pensais que ça lançait un process externe donc avec un PID différent de mon programme non ?
    En plus je lance plusieurs QProcess en même temps donc je voit différents pid lorsque je les récupères

  8. #8
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Vu que vous utilisez startDetached() avec une instance, alors que c'est une méthode statique, je vous conseille d'utiliser start() à la place et de faire un QProcess par processus que vous voulez lancer.
    Ensuite, vous pouvez récupérer les ID avec processId(), ou directement les arrêter avec kill().
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  9. #9
    Membre du Club
    Femme Profil pro
    Apprentie Développeuse
    Inscrit en
    Février 2013
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Apprentie Développeuse
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 106
    Points : 44
    Points
    44
    Par défaut
    J'ai essayé avec start mais ça ne marche pas car mon application doit pouvoir ouvrir plusieurs exe (via des boutons)
    j'ai une fichier de conf qui dit que pour tel bouton ça lance tel exe et je peux ouvrir autant d'exe que je veux par bouton donc par exemple lancer plusieurs fois Notepad++ si je le décide !
    sauf que start ne me le permet pas !

    je travail sur cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void MainWindow::quitter(){
     
        QStringList liste = fen->get_listeProcess_str();// mes process ouverts via startdetached
       QStringList listeProcW = getAllProcess(); // ts les process du pc 
     
        while(liste.count() != 0){ //boucle qui lit tous mes pid et les supp un par un mais LA EST MON PB
            QString valeur = liste.first();
             liste.removeFirst();
            QString syst = "taskkill /PID "+valeur;
            system(syst.toAscii().data());
    qApp->quit();
     }
    ce code me supprime uniquement le premier QProcess lancé mais pas les autres et ne ferme pas l'application principale

  10. #10
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Je viens de voir un startDetached() qui retourne le PID -> http://qt-project.org/doc/qt-4.8/qpr...#startDetached
    Pourquoi n'utilisez vous donc pas celui là ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  11. #11
    Membre du Club
    Femme Profil pro
    Apprentie Développeuse
    Inscrit en
    Février 2013
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Apprentie Développeuse
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 106
    Points : 44
    Points
    44
    Par défaut
    Merci LittleWhite pour vos réponses

    j'ai utilisé celui-là j'ai juste un problème c'est que je n'arrive pas à les fermer (j'arrive à fermer le 1er sur ma liste) mais pas les autres si plusieurs existent , et la liste ne se vide pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(int i=0 ; i< liste.count() ; ++i){
       QString valeur = liste.first();
           QMessageBox::warning(this, "Fermeture application", "val"+valeur);
           liste.removeAll(valeur);
            QString syst = "taskkill /PID "+valeur;
            system(syst.toAscii().data());

  12. #12
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Vous ne devriez pas faire un "system()" car votre méthode n'est pas portable.

    Vous tuez que le premier à cause du :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QString valeur = liste.first();
    qui devrait être un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QString valeur = liste[i];
    De plus, je ne ferai pas de : liste.removeAll(valeur); car le PID est sensé être présent une seule fois dans votre liste.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  13. #13
    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
    Hello,

    N'est-ce pas plus simple de créer une instance de QProcess par processus lancé.

    Ensuite il suffit d'appeler QProcess::terminate(). Comme l'as mentionnée LittleWhite, le fait d'utiliser startDetached ne permet pas de garder un lien entre l'objet QProcess et le processus lui même.

    Voici un exemple un widget contenant un bouton qui ouvre une nouvelle fenêtre de notepad à chaque clique. Lors de la fermeture du widget, toutes les fenêtres de notepad sont fermé automatiquement.

    widget.h
    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
    #ifndef WIDGET_H
    #define WIDGET_H
     
    #include <QWidget>
    #include <QProcess>
     
    class Widget : public QWidget
    {
        Q_OBJECT
     
    public:
        explicit Widget(QWidget *parent = 0);
        ~Widget();
     
    private slots:
        void runProcess();
        void processFinished();
     
    private:
        QList<QProcess *> processes;
    };
     
    #endif // WIDGET_H
    widget.cpp
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    #include "widget.h"
     
    #include <QPushButton>
    #include <QBoxLayout>
    #include <QDebug>
     
    Widget::Widget(QWidget *parent) :
        QWidget(parent)
    {
        QPushButton *button = new QPushButton( "Notepad" );
        QBoxLayout *l = new QBoxLayout( QBoxLayout::LeftToRight );
        l->addWidget( button );
        setLayout( l );
     
        connect( button, SIGNAL( clicked()), this, SLOT( runProcess() ) );
    }
     
    Widget::~Widget()
    {
        //Parcours de tous les process
        while( processes.size() > 0 ){
            QProcess *p = processes.first();
     
            //Test si le process n'est pas déjà terminé
            if( p->state() != QProcess::NotRunning ){
                p->terminate(); //On demande au process de se terminer
                p->waitForFinished(); //Il est important d'attendre que le process se termine.
            }
            //Suppression de l'objet QProcess de la liste
            processes.removeFirst();
            //Libération de la mémoire.
            p->deleteLater();
        }
    }
     
    void Widget::runProcess()
    {
        //On crée une nouvelle instance de QProcess
        QProcess *process = new QProcess;
        process->start( "notepad" );
        //On est averti si le processus est stoppé.
        connect( process, SIGNAL( finished( int ) ), this, SLOT( processFinished() ) );
        //Ajout du process dans la liste principal
        processes << process;
    }
     
    void Widget::processFinished()
    {
        QProcess *p = qobject_cast< QProcess * >( sender() );
        if(p){
            qDebug() << "Process finished";
            processes.removeOne( p );
            p->deleteLater();
        }
    }

Discussions similaires

  1. Fermer une fenêtre et pas toutes les fenêtres ouvertes
    Par Sinakhine dans le forum Général Java
    Réponses: 4
    Dernier message: 29/10/2012, 13h06
  2. Fermer toutes les tables ouvertes
    Par jnmab dans le forum VBA Access
    Réponses: 2
    Dernier message: 09/09/2010, 14h34
  3. Réponses: 3
    Dernier message: 26/05/2006, 17h35
  4. Fermer toutes les fenetres
    Par imeys dans le forum Autres Logiciels
    Réponses: 5
    Dernier message: 09/04/2006, 12h06
  5. [VB6] Quitter l'appli et fermer toutes les feuilles...
    Par The Bob dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 10/06/2003, 21h06

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