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 :

Rapidité du système signal-slot

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Mars 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 28
    Par défaut Rapidité du système signal-slot
    Bonjour à tous,

    Je débute sur Qt et je cherche à créer une liste d'objet myCell constituant une grille. Cet objet doit mettre en place un signal qui va permettre d'activer un slot de GraphicsScene qui permet de mettre à jour le QRectItem correspondant, lorsque son myCell correspondant est modifié.

    Mon code est le suivant:

    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
     
    void myCalculator::createGrille(int x, int y, bool vis)
    {
        grilleVisible = vis;
        nbLines = x;
        nbColumns = y;
        for (int i = 0; i<=(x*y); i++)
        {
            int abs = i%x + 1;
            int ord = i/x + 1;
            myCell* cell = new myCell(abs, ord, vis, this);
            QObject::connect(cell, SIGNAL(update(QPoint, QColor)),  pt_manager, SLOT(updateRectAt(QPoint, QColor)));
            cell->putColor();
            grille.append(cell);
        }; 
    }
    putColor() est une fonction de myCell qui permet de déterminer la couleur à afficher.

    Tout fonctionne, ça compile bien, par contre, je trouve cela un peu lent. Par exemple, pour 90 000 éléments, ça met plus de 135 000 millisecondes pour faire la boucle. Si j'enlève juste le signal/slot, ça tombe à 238 millisecondes.

    Je me demande donc si j'ai mal codé quelque chose ou si c'est simplement le système SIGNAL/SLOT qui n'est pas adapté dans mon cas?

  2. #2
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Par défaut
    Le problème n'est pas la rapidité de l'envoi ds signaux mais le temps de réalisation des multiples connexions.
    Au cas où QSignalMapper serait légèrement plus rapide sur un grand nombre d'éléments, je te propose de regarder ceci : http://louis-du-verdier.developpez.c...dations/#LIV-C.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Mars 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 28
    Par défaut
    Merci pour la réponse, je vais tester ça. J'avais lu l'article mais je n'avais pas tenté car à la lecture du code, il me semblait que ça allait faire appel à autant de connect().

    Sinon je me disais de tester en déclarant la fonction updateRectAt() en amie, peut-être et en la lançant à partir de myCell, ou alors, en stockant un pointeur sur la graphicScene dans myCell et en lançant à partir de là?

  4. #4
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Par défaut
    Citation Envoyé par Wu_Wei Voir le message
    Merci pour la réponse, je vais tester ça. J'avais lu l'article mais je n'avais pas tenté car à la lecture du code, il me semblait que ça allait faire appel à autant de connect().
    Oui, mais sur le même objet, ce qui change sans doute au niveau des performances. Ma théorie, très faible, s'appuie là-dessus :
    On an i586-500, you can emit around 2,000,000 signals per second connected to one receiver, or around 1,200,000 per second connected to two receivers.
    Si les performances d'un point de vue de l'émission changent, peut-être qu'il en va de même pour le temps pour connecter.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    tu fait 900000 connect à la suite et c'est cela qui prend du temps?
    tu es en debug ou release?

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Mars 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 28
    Par défaut
    Merci pour les réponses.

    Oui je fais 90 000 connect à la suite enfin pour être plus précis, je fais 90 000 fois une itération qui créé un objet et le connecte ensuite à un objet gérant GraphicScene.

    Donc à la fin de l'itération, j'ai 90 000 objets qui possèdent un signal connecté à un slot d'un objet (cet objet a donc un slot qui est connecté à 90 000 signaux).

    Je suis en mode release sur QtCreator windows vista. J'ai pas testé sur mon mac.

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    un connect fait pas mal de chose, comme vérifier que la connexion est possbile, que le signal et slot existe, ...
    Donc faire 90000 (ce que je trouve énorme) prend un certain donc oui c'est normale.
    A mon avis y as un problème de conception.
    Si tu peut expliquer un peu plus ton projet?.

  8. #8
    Membre éclairé

    Profil pro
    Inscrit en
    Mars 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 28
    Par défaut
    Ben le projet est assez simple en soi, je teste le framework Qt (et C++ par la même) en cherchant à créer une grille 2D qui se mette à jour en temps réel par rapport à un code calcul correspondant. Pour situer le contexte, je viens du Smalltalk donc je suis plutôt habitué à la conception MVC.

    J'ai fait une architecture comme suivant:

    - une classe gérant la mainwindow

    - une classe gérant la graphicScene qui est dans le mainWindow

    - une classe qui gère tous les calculs et qui génère toutes les cellules

    puis, plus précisément,

    - une sous classe de QGraphicsRectItem qui me permet de définir des petits trucs d'affichage ainsi que gérer les interactions utilisateur (genre clic droit sur une cellule)

    - une classe myCell, sous classe de QObject, qui est l'unité de base qui fait les calculs à l'échelle d'une cellule. En effet, je tiens à ce que la cellule soit identifiable en tant qu'objet, ça peut donner des trucs intéressants pour faire de l'automate cellulaire ou du multi agents spatialement explicite.

    Donc dans mon cas, je génère une graphicsScene contenant le nombre de QGraphicsRectItem souhaités puis je créé mes objets myCell qui sont reliés par un Signal/Slot à la graphicsScene pour prévenir quand ils sont updatés, que la scène se mette à jour .

    Peut-être qu'en C++ ça pourrait être optimisé par l'utilisation de Vectors ou QList en Qt représentant les valeurs de la grille entière pour une variable, au lieu de faire "une cellule = un QGraphicRectItem + un myCell", mais à l'origine, en Smalltalk, ça me permettait d'éviter de manipuler des conteneurs de grande taille, ce qui est appréciable dans ce langage. Dans mes programmes classiques, une cellule peut contenir plus d'une douzaine de double plus d'autres types de variables comme par exemple, un vector de pointeurs définissant le voisinage, donc c'est plus pratique aussi au niveau du code d'avoir une cellule bien identifiée comme objet à part entière.

Discussions similaires

  1. Lier les signal/slot de Qt à boost::signal
    Par Davidbrcz dans le forum Qt
    Réponses: 7
    Dernier message: 25/04/2008, 12h50
  2. Problème de connect (signal/slots)
    Par Alain Defrance dans le forum Qt
    Réponses: 5
    Dernier message: 20/03/2008, 22h58
  3. help signal slot
    Par psyko72 dans le forum Qt
    Réponses: 1
    Dernier message: 31/12/2007, 14h51
  4. Signals slots boost/libsigc++/Qt
    Par epsilon68 dans le forum Qt
    Réponses: 14
    Dernier message: 10/08/2006, 22h31
  5. Connexion "directe" signal - slot
    Par broidsy dans le forum Qt
    Réponses: 3
    Dernier message: 27/02/2006, 10h37

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