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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

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, 11h50
  2. Problème de connect (signal/slots)
    Par Alain Defrance dans le forum Qt
    Réponses: 5
    Dernier message: 20/03/2008, 21h58
  3. help signal slot
    Par psyko72 dans le forum Qt
    Réponses: 1
    Dernier message: 31/12/2007, 13h51
  4. Signals slots boost/libsigc++/Qt
    Par epsilon68 dans le forum Qt
    Réponses: 14
    Dernier message: 10/08/2006, 21h31
  5. Connexion "directe" signal - slot
    Par broidsy dans le forum Qt
    Réponses: 3
    Dernier message: 27/02/2006, 09h37

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