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 :

Reprendre la main sur le programme

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 22
    Points : 16
    Points
    16
    Par défaut Reprendre la main sur le programme
    J'ai developpé un petit conway's game of life pour un projet. Le probleme est qu'une fois que j'appuie sur Start, le programme rentre dans une boucle infinie ( jusqu'a la c'est normal, c'est moi qui l'ai codé :p ), le probleme, c'est que je ne peux plus appuyer sur le bouton close ou sur la croix, il faut que je kill le process pour arreter le programme.

    Donc ma question : comment faire tourner le programme en fond tout en gardant la main pour appuyer sur les boutons ( close pour l'instant, sans doute plus d'option plus tard ).

    La fonction qui boucle est game()

    merci d'avance

    window.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
    31
    32
    33
    34
    35
    36
    37
     
    #ifndef WINDOW_H
    #define WINDOW_H
     
    #include <QWidget>
    #include <QPainter>
    #include "board.h"
    #include "paintdevice.h"
     
     
    class QPushButton;
    class QLineEdit;
    class QLabel;
    class QImage;
     
    class window : public QWidget
    {
    	Q_OBJECT
    public:
            window(QWidget *parent = 0);
     
     
    //protected:
    //        void paintEvent ( QPaintEvent * event );
     
    private slots:
            void game();
    private:
            Board *conway;
            QLabel *lblCount;
            QLineEdit *leditCount;
            QPushButton *startButton;
            QPushButton *closeButton;
            int Count;
    };
     
    #endif
    window.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
     
    #include <QtGui>
    #include <iostream>
    #include "window.h"
     
    using namespace Qt;
     
    window::window(QWidget *parent)
    	:QWidget(parent) {
     
            conway=new Board();
     
            lblCount= new QLabel (tr("Loop Count:"));
         //   lblCount->move(Board::LENGTH*5 + 10,60);
            leditCount = new QLineEdit;
          //  leditCount->move(Board::LENGTH*5 + 30,60);
     
            startButton = new QPushButton(tr("&Start"));
            startButton->setDefault(true);
         //   startButton->move (20,Board::LENGTH*5 + 10);
     
            closeButton = new QPushButton(tr("&Close"));
        //    closeButton->move (Board::LENGTH*5 + 10,40);
     
            connect(startButton, SIGNAL(clicked()), this, SLOT(game()));
            connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));
     
            Count = 0;
     
            QHBoxLayout  *boardLayout = new QHBoxLayout ;
            boardLayout->addWidget(conway);
     
            QVBoxLayout *topLayout = new QVBoxLayout;
            topLayout->addWidget(startButton);
            topLayout->addWidget(closeButton);
     
            QHBoxLayout  *bottomLayout = new QHBoxLayout ;
            bottomLayout->addWidget(lblCount);
            bottomLayout->addWidget(leditCount);
            bottomLayout->addStretch();
     
            QVBoxLayout *optionLayout= new QVBoxLayout;
            optionLayout->addLayout(topLayout);
            optionLayout->addLayout(bottomLayout);
     
            QHBoxLayout *mainLayout= new QHBoxLayout;
            mainLayout->addLayout(boardLayout);
            mainLayout->addLayout(optionLayout);
            setLayout(mainLayout);
     
            setWindowTitle(tr("Conway's Game of Life"));
     
            setFixedHeight(sizeHint().height());
    }
     
    void window::game() {
            //std::cout << "I'm in" << std::endl;
            while(conway->isEmpty()) {
                    Count+=1;
                    leditCount->text() = Count;
                    conway->nextLoop();
                    conway->repaint();
    	}
    }

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Salut,

    Alors avant tout, tu as un énorme problème de fuites mémoires. En ne déclarant aucun parent à tes layouts, la femeture de ta fenêtre détruira ta fenêtre principale, mais ne détruira ni les layouts, ni tout ce qu'elles contiennent. C'est une erreur grave !
    Après relecture de ton code, je mets ma précédente citation en commentaires. En effet, je n'avais pas vu le Cependant, elle est valable de manière générale, pense à mettre les parents.

    Pour ta question, il est normal que ton IHM ne réponde plus lorsque tu effectues un long calcul (ou infini dans ton cas) dans le même processus (ou thread en anglais). Si ton traitement sera en effet infini jusqu'à ce que l'utilisateur intervienne, alors tu devra sûrement faire une application multi-processus (ou multi thread).

    Avec Qt, il existe la classe QThread. Ce problème a également été soulevé, et résolu, de nombreuses fois sur le forum. Effectue une recherche.

    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 22
    Points : 16
    Points
    16
    Par défaut
    J'esperais qu'il y aurait une solution plus simple et plus rapide à mettre en place

    Merci beaucoup je vais me pencher sur Qthread

  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
    Tu pourrais aussi utiliser l'eventloop, en utilisant un timer qui appellera un slot game par exemple.
    Avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void window::game() 
     {
       Count+=1;
        leditCount->text() = Count;
        conway->nextLoop();
        conway->repaint();
    }

Discussions similaires

  1. Reprendre la main sur OSGi
    Par darkbird dans le forum OGSi
    Réponses: 3
    Dernier message: 21/03/2013, 17h54
  2. reprendre la main sur un programme
    Par g.abdou dans le forum Administration système
    Réponses: 8
    Dernier message: 02/03/2011, 10h50
  3. SQL 2008 Reprendre la main sur une instance
    Par nivsql dans le forum Administration
    Réponses: 17
    Dernier message: 13/10/2009, 11h02
  4. [O-07] Impossible de reprendre la main sur OutLook
    Par Invité dans le forum Outlook
    Réponses: 8
    Dernier message: 31/12/2008, 09h05
  5. Reprendre la main sur le corps d’un get/setter ?
    Par three minute hero dans le forum BOUML
    Réponses: 1
    Dernier message: 25/07/2007, 11h43

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