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 :

Stopper un slot à partir d'un autre


Sujet :

Qt

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Par défaut Stopper un slot à partir d'un autre
    Bonjour,

    J'ai créé de nombreux slots dans mon application QT, seulement je ne ne trouve pas comment fermer ou stopper un slot() à partir d'un autre slot().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void MainWindow::slot1(){
    //Lancement d'un script python à durée illimitée si on l'arrête pas
    }
    void MainWindow::slot2(){
    //slot1.stop() ? ou quelque chose comme cela
    }
    Je pense que c'est possible mais je ne trouve nul part de réponse à ma question.

  2. #2
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut
    Bonjour,

    à mon avis, tu dois pouvoir le faire mais non pas avec un slot, plutôt un signal.
    Dans ton slot qui exécute un script pyhton, à l'émission d'un signal pour stopper le contenu du slot, tu fais un bête return.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Par défaut
    Bonjour, merci pour votre réponse,

    je ne suis pas sûre de vous avoir bien compris, je suis donc censé faire cela ?

    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 MainWindow::slot1(){
    //Ce slot est sur un bouton Start
     
    //Lancement d'un script python à durée illimitée si on l'arrête pas
    QProcess *myProcess = new QProcess;
    myProcess->startDetached(dev/spectre.py);
     
    return; // ?
    }
    void MainWindow::slot2(){
    //Ce slot est sur un Bouton Stop
     
    //slot1.stop() ? ou quelque chose comme cela
    }
    En gros, je veux juste que quand j'appuie sur le bouton Stop, le script python en cours de fonctionnement s'arrête.

  4. #4
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut
    Ce que tu peux faire (ce n'est peut-être pas le plus propre), c'est conserver dans ta classe un booléen isWorking que tu met à true quand un signal est émis avec le bouton start, et à false si c'est l'autre signal qui est émis (celui du bouton stop, donc). Le tout, pour un seul slot :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void slot()
    {
       if(isWorking)
       {
          //on stoppe l'éxecution du script
       }
        else
        {
          //on lance le script
        }
    }

    Pour ce qui est de stopper l'éxécution du script, c'est à toi de voir comment faire, car sans code je ne peux malheureusement pas t'en dire plus.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Par défaut
    Merci beaucoup, il n'y a pas un moyen de kill le Qprocess (dans mon cas myProcess) directement ?


    Dans mon code il n'y a rien de plus que ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void MainWindow::slot1(){
    //Ce slot est sur un bouton Start
     
    //Lancement d'un script python à durée illimitée si on l'arrête pas
    QProcess *myProcess = new QProcess;
    myProcess->startDetached(dev/spectre.py); //cela lançe mon spectre.py
    }

  6. #6
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut
    Citation Envoyé par quake3 Voir le message
    Merci beaucoup, il n'y a pas un moyen de kill le Qprocess (dans mon cas myProcess) directement ?


    Dans mon code il n'y a rien de plus que ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void MainWindow::slot1(){
    //Ce slot est sur un bouton Start
     
    //Lancement d'un script python à durée illimitée si on l'arrête pas
    QProcess *myProcess = new QProcess;
    myProcess->startDetached(dev/spectre.py); //cela lançe mon spectre.py
    }
    Essayez de prendre le réflexe de chercher d'abord et avant tout une réponse dans la doc , vous pourriez rapidement trouver vous-même une solution

    Surtout que Qt propose une très bonne documentation, et developpez.com propose même une traduction française d'une grosse partie de cette documentation (dont la classe QProcess)

    Dites-nous si cela a résolu votre problème ^^

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Par défaut
    J'avais déjà vu la méthode kill(); cependant il ne se passe rien lorsque je l’exécute, mon spectre reste toujours actif

  8. #8
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut
    Citation Envoyé par quake3 Voir le message
    J'avais déjà vu la méthode kill(); cependant il ne se passe rien lorsque je l’exécute, mon spectre reste toujours actif
    tu es passé en mode debug pour voir ce qu'il se passait ? ensuite, n'oublie pas que kill est un slot, il faut donc l'utiliser comme tel, pour le déclencher.

  9. #9
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Par défaut
    Euh je ne comprends pas ta dernière phrase, le statut de "slot" est juste un plus si on veut l'utiliser en callback dans le système signal/slot de Qt, ça reste une méthode normale.

    quake3 : Tu peux nous montrer du code stp ?

  10. #10
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut
    Citation Envoyé par Troudhyl Voir le message
    Euh je ne comprends pas ta dernière phrase, le statut de "slot" est juste un plus si on veut l'utiliser en callback dans le système signal/slot de Qt, ça reste une méthode normale.

    quake3 : Tu peux nous montrer du code stp ?

    Ah pardon, je ne pensais pas qu'on pouvait l'appeler comme une méthode normale. je pensais que le seul moyen d'arrêter son script puisqu'il tourne indéfiniment, c'était justement d'appeler le slot comme callback, pour permettre de tuer le pus sans attendre la fin d'éxécution de ce dernier.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Par défaut
    Voici mon code :

    MainWindow.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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QProcess>
    #include <QString>
    #include <QDebug>
    #include <QDir>
    #include <QFile>
    #include <QFileDialog>
    #include <stdlib.h>
    #include <stdio.h>
    #include <cstring>
    #include <cstdlib>
    #include <string>
    #include <iostream>
    #include <sstream>
    #include <limits.h>
     
    using namespace std;
     
    QProcess *myProcess = new QProcess;
    QProcess *myProcess2 = new QProcess;
     
    MainWindow::MainWindow(QWidget *parent) :
            QMainWindow(parent),
            ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        this->setStyleSheet("QGroupBox { background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #E0E0E0, stop: 1 #FFFFFF); border: 2px solid gray; border-radius: 5px; margin-top: 1ex; }");
    }
     
    MainWindow::~MainWindow()
    {
        delete ui;
    }
     
    void MainWindow::changeEvent(QEvent *e)
    {
        QMainWindow::changeEvent(e);
        switch (e->type()) {
        case QEvent::LanguageChange:
            ui->retranslateUi(this);
            break;
        default:
            break;
        }
    }
     
    void MainWindow::slotStartC(){
     
        bool dir0 = QDir("temp").exists();
        if (dir0 == false){
            QDir().mkdir("temp");
        }
     
        myProcess->startDetached("dev/spectre.py");
     
        qDebug() << "myProcess started()";
    }
     
    void MainWindow::slotStopC(){
        //myProcess2->startDetached("/bin/bash", QStringList() << "demod.sh");
     
    	myProcess->kill();
     
    }
    Mainwindow.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
    24
    25
    26
    27
    28
    29
    30
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
     
    #include <QMainWindow>
     
    namespace Ui {
        class MainWindow;
    }
     
    class MainWindow : public QMainWindow {
        Q_OBJECT
    public:
        MainWindow(QWidget *parent = 0);
        ~MainWindow();
     
     
    protected:
        void changeEvent(QEvent *e);
     
    private:
        Ui::MainWindow *ui;
     
    public slots:
        void slotStartC();
        void slotStopC();
     
        //void getPath();
    };
     
    #endif // MAINWINDOW_H
    Sinon je ne vois pas trop comment faire ceci :
    tu es passé en mode debug pour voir ce qu'il se passait ? ensuite, n'oublie pas que kill est un slot, il faut donc l'utiliser comme tel, pour le déclencher.
    Merci beaucoup pour votre aide

  12. #12
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Par défaut
    C'était une erreur (voir post précédent le tien), tu peux faire le kill() comme tu fais. Par contre, ton code compile ? Je ne comprends pas étant donné que startDetached() est une méthode statique et que donc tu ne peux pas l'utiliser comme cela. Et que comme son nom l'indique, ça "start detached" donc tu n'as plus de contrôle après. Il faut utiliser start().

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 111
    Par défaut
    Merci beaucoup,
    en fait ça ne fonctionnait pas car j’utilisais StartDetached() au lieu de Start(), je vous remercie infiniment pour l'aide apporté!

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

Discussions similaires

  1. Requête update à partir d'une autre table
    Par amiral thrawn dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/02/2024, 11h40
  2. Réponses: 3
    Dernier message: 24/01/2015, 21h54
  3. [VB.NET] Activer procédure d'une form à partir d'une autre
    Par ricil78 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 02/05/2004, 14h52
  4. UPDATE : table à partir d'une autre
    Par Laura dans le forum Requêtes
    Réponses: 2
    Dernier message: 28/10/2003, 21h34
  5. Lancer un prog du DD à partir d'un autre prog
    Par le mage tophinus dans le forum Assembleur
    Réponses: 12
    Dernier message: 22/01/2003, 14h24

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