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 :

Fermeture de l'interface et calculs lourds


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Par défaut Fermeture de l'interface et calculs lourds
    Bonjour à tous,

    j'ai un problème très simple et pourtant je n'ai trouvé nulle part une solution.
    J'ai une fenêtre Qt avec un bouton qui lance une fonction de traitement qui prends plusieurs minutes à s’exécute, le problème est que lorsque je ferme la fenêtre avant la fin du traitement la fonction ne s’arrête pas et le traitement continue en arrière plan, comment faire pour empêcher cela ?
    En gros, je voudrais que fermer la fenêtre arrête la totalité de l’exécution du code.
    Avez-vous déjà eu ce problème ?

    Merci d'avance pour l'aide,
    Matthieu

  2. #2
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut
    Tu lances ton traitement dans un autre thread peut être ? Si oui il faudra le stopper et attendre qu'il ait terminé avant de quitter.
    Dans tous les cas tu dois stopper ton traitement quand tu détectes la fermeture de ta fenêtre (ou de l'appli). Tu peux faire ça dans void QWidget::closeEvent(QCloseEvent * event) (de ta QMainWindow), ou bien en utilisant le signal void QCoreApplication::aboutToQuit() mais comme le dit la doc c'est vraiment au dernier moment que tu vas exécuter ce code là et il n'est pas possible d'avoir une interaction utilisateur.
    De manière générale il est préférable de gérer l'arrêt de ton traitement au plus près du code qui le lance, ne serait-ce que pour l'accès à l'objet qui gère le thread par exemple.

  3. #3
    Membre très actif Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Par défaut
    Merci de ta réponse et désolé pour cette réponse tardive.

    En gros dans mon code j'ai plein de boucle for() qui s’enchaîne quand je clique sur des boutons et donc du coup je dois créer un boolean de fermeture de ma fenêtre et le vérifier dans chaque boucle, c'est un peu "relou" à faire, non ? (mon code est assez conséquent vue que je développe une IA)

    Je pensais vraiment que Qt avais une fonction qui aurait permis de kill la totalité du code lancé par une fenêtre (en gros, fermer le processus sans aller dans le gestionnaire de tache) .

    Cordialement,
    Matthieu

    Ps: Mon thread est effectué automatiquement grâce à la fonction QObject::connect() qui relis ma fonction à l'appuis du bouton.

  4. #4
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut
    On peut toujours tout tuer, c'est juste qu'en général on préfère terminer proprement (en libérant des ressources, en écrivant dans des fichiers etc). Selon la tâche on peut vouloir enregistrer l'état courant et proposer de la reprendre plus tard.

    C'est sûr que selon ton code tester un booléen venant du thread principal est plus ou moins pénible, il faut décider de "paliers" réguliers dans la procédure de calcul où tester le booléen et interrompre les calculs. Pour ça tu peux envisager une petite fonction qui teste la valeur et quitte le thread, pas besoin de copier coller le code du test donc, juste à appeler ta fonction à chaque palier.

    Sinon tu dois pouvoir faire ce que tu veux avec void QThread::terminate().

  5. #5
    Membre très actif Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Par défaut Solution
    Merci pour ton aide.
    J'ai testé ça, mais ça ne fonctionne pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void MainWindow::closeEvent(QCloseEvent *event)
    {
        ui->button_start->thread()->terminate();
    }
    Je ne comprends pas pourquoi quelque chose d'aussi simple est aussi dur à faire, j'ai l'impression de louper un truc

  6. #6
    Membre chevronné

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Mars 2015
    Messages : 294
    Par défaut
    Bonjour ce que tu fais avec ton code precedent c'est que tu termines le thread principal de ton programme,car le thread de ton bouton donc d'un element de l'UI est le thread d'UI donc le thread principal.
    Donc comme solution,il faut que tu conserves un pointeur sur le thread secondaire que tu crees et que tu lances dans ta classe Mainwindow (comme variable membre de Mainwindow) et que tu appelles dans la methode precedente MainWindow::closeEvent la methode terminate de ce pointeur .(m_pthread->terminate(); si tu as mis le pointeur sur le thread secondaire dans m_pthread)

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

Discussions similaires

  1. Interface de Calcul proche de Matlab
    Par kong.stan dans le forum Qt
    Réponses: 7
    Dernier message: 28/03/2010, 19h48
  2. Réponses: 17
    Dernier message: 01/06/2009, 03h32
  3. fermeture d'une interface java
    Par katijama dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 12/05/2009, 19h08
  4. Caractères grecs et récupération de valeur à la fermeture de l'interface
    Par Pierrot92320 dans le forum Interfaces Graphiques
    Réponses: 10
    Dernier message: 13/04/2009, 15h09
  5. [JOPTIONPANE] Fermeture de l'interface graphique
    Par meda dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 05/05/2006, 15h42

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