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 :

Ralentissement énorme


Sujet :

Qt

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut Ralentissement énorme
    Bonjour tous,

    j'ai un code qui me permet de calculer des valeurs de plusieurs courbes, lorsque je compile ce code avec code block ou un autre IDE alors j'ai un resultat en 10secondes.

    J'ai fais une interface graphique avec Qt pour tracer les courbes, le probleme et que le temps de calcul est devenu enorme comparativement au 10sec:

    => ça passe de 10seconde à presque 1minute !

    je voudrais savoir si c'est normal que je code soit autant ralenti ?

    => j'ai un ami qui avait quelque chose d'un peu pret similaire il y a quelques temps sous C++ builder et le ralentissement etait presque quasi inexistant...

    Je vais mettre un bout de code qui permet de montrer comment je fais pour mettre à jour mon graphique à chaque iteration:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int timeNb4=Points2_OneXtwoY.size();
               QVector<double> x4(timeNb4);
               QVector<double> y4(timeNb4);
               //i fill Qvectors
               for (int z=0;z<timeNb4;z++)
               {
                  x4.append( Points2_OneXtwoY[z][0] );
                  y4.append( Points2_OneXtwoY[z][1] );
               }
               myPlot4->replot();
               Total.setSamples(x4.data(),y4.data(),x4.size());
               repaint();

    peut etre que mon probleme vient du faire que je fasse replot ou repaint ?

    => comment faites vous si vous voulez mettre à jour votre interface graphique, quelle fonction utilisez vous?

    j'espere que vous pourrez m'aider

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 243
    Par défaut
    Ah oui les opération de refresh, repaint etc sont souvent gourmandes, ça ne sert à rien de les faire 500x par secondes de toute façon.

    Essaie en commentant la ligne pour voir si c'est ça qui ralenti.

    Alors tu fait ton repaint à la fin de ta boucle, lq le traitement est terminé.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut
    en fait ce que je veux faire c'est un graphique qui au fur et à mesure de l'execution me trace les points

    => en fait je crois que un de mes problemes et que je retrace à chaque fois toute la liste des points + le dernier calculé

    => en fait il faudrait que je retrace seulement le dernier a chaque fois mais que sur l'affichage les précédant points calculé soient toujours présent

    savez vous comment faire? quelle fonction utiliser? je ne crois pas que repaint permettent de faire ceci?

    ps: je ne peux pas tester en ce moment

    Citation Envoyé par ness522 Voir le message
    Alors tu fait ton repaint à la fin de ta boucle, lq le traitement est terminé.
    je n'ai pas compris cette phrase, que voulez tu dire ?

  4. #4
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 243
    Par défaut
    Citation Envoyé par BdidB Voir le message
    comment je fais pour mettre à jour mon graphique à chaque iteration
    je veux juste dire de ne pas rafraichir le widget à chaque itération, mais à la fin du traitement des données.

    à moins que tu ne doives visualiser des choses qui bougent ?

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut
    Citation Envoyé par ness522 Voir le message
    à moins que tu ne doives visualiser des choses qui bougent ?
    c'est exactement ce que je veuc faire mais je ne sais pas comment le faire d'une façon qui ne fasse pas tout ramer

    => je pense que c'est possible car je connaissais quelqu'un qui utilisé C++builder et ça fonctionné tres bien sans trop ramer

    le probleme c'est que je ne sais pas quoi utiliser avec Qt pour ne pas trop faire ramer le rafraichissment

    => c'est peut etre dû au fait que je retrace tout à chaque fois?
    je ne devrais retracer que le dernier resultat mais comment garder ce qui a été affiché précédemment?

  6. #6
    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

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut
    je n'ai pas vraiment saisi la différence entre les deux mais ce que j'ai compris c'est que repaint() est responsable du ralentissement que j'ai.

    => j'ai donc testé en remplacent le repaint() par un update() et en effet ça ne rame plus mais gros probleme:

    => au lieu de m'afficher les différents point du graphique au cours de l'execution ça ne m'affiche que le dernier tracé

  8. #8
    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
    Le repaint correspond à un appel de la méthode paint. Donc tu n'arrêté pas de redessiner pour rien.
    Le update schedule le repaint au travers de l'eventloop.
    Vue qu'il n'y as plus rien qui s'affiche tu doit surement bloquer le thread principale.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut
    merci beaucoup de ta reponse
    c'est tres gentil d'avoir pris le temps de repondre

    Neanmoins, c'est un peu trop technique pour moi:

    Citation Envoyé par yan Voir le message
    Le repaint correspond à un appel de la méthode paint. Donc tu n'arrêté pas de redessiner pour rien.
    pourquoi pour rien? si lors de l’exécution, j'ai des nouveaux points que je dois afficher alors je dois bien redessiner le graphique ?

    Citation Envoyé par yan Voir le message
    Le update schedule le repaint au travers de l'eventloop.
    je ne comprends pas du tout là
    peux tu me faire une traduction: geek => non informaticien lol

    Citation Envoyé par yan Voir le message
    Vue qu'il n'y as plus rien qui s'affiche tu doit surement bloquer le thread principale.
    je ne comprends pas, peux tu détailler s'il te plait ?

    je te remercie d'avance

  10. #10
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 243
    Par défaut
    repaint force le dessin, c'est un appel de fonction classique, le dessin se fait entre deux itérations de ton calcul.

    update est différent, il dit à Qt que le widget a besoin d'être redessiné, c'est très rapide (change simplement un flag) mais le dessin en lui même est fait par Qt quand Qt en a le temps. Or vu que tu est dans une boucle de calcul qui prend tout le CPU pendant ce laps de temps, Qt ne te redessine pas le widget car il n'en a pas le temps. Il ne le fait qu'une fois le calcul terminé.

    Tu peux néanmoins dire à Qt de traiter les évènements de temps à autres avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QCoreApplication::processEvents();
    Maintenant si tu ajoutes ça dans ta boucle juste après le update, tu risques de te retrouver dans le cas du repaint :p
    Je pense que tu dois prendre en compte le nombre d'itération de ta boucle (10x, 1000x, ??) et le temps total de ton algorithme sans dessin, pour essayer de demander à Qt de forcer le dessin mais pas à chaque fois, pas à chaque tour de boucle. Par exemple, tu ne fais appel au repaint que toutes les 500 itérations, ça devrait te permettre d'avoir un compromis entre les deux solutions actuelles.

    Plus compliqué, il est aussi possible de faire le calcul dans un thread, en parallèle. Tu aurais alors deux tâches qui fonctionnent le plus vite qu'elle peuvent mais qui fonctionnent en même temps :
    - le calcul de tes points
    - l'affichage de tes courbes
    Attention la mise en place des threads n'est pas triviale

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut
    Citation Envoyé par ness522 Voir le message
    repaint force le dessin, c'est un appel de fonction classique, le dessin se fait entre deux itérations de ton calcul.
    oui c'est cela que je cherche à l'origine, mais je ne pensais pas que ça aller ramer à ce point, surtout qu'une personne avait fait quelque chose avant moi en utilisant C++builder et ça ne rame pas du tout (pour la meme chose que moi un peu pret)


    Citation Envoyé par ness522 Voir le message
    update est différent, il dit à Qt que le widget a besoin d'être redessiné, c'est très rapide (change simplement un flag) mais le dessin en lui même est fait par Qt quand Qt en a le temps. Or vu que tu est dans une boucle de calcul qui prend tout le CPU pendant ce laps de temps, Qt ne te redessine pas le widget car il n'en a pas le temps. Il ne le fait qu'une fois le calcul terminé.
    ah ok! je comprends

    Citation Envoyé par ness522 Voir le message
    Tu peux néanmoins dire à Qt de traiter les évènements de temps à autres avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QCoreApplication::processEvents();
    Maintenant si tu ajoutes ça dans ta boucle juste après le update, tu risques de te retrouver dans le cas du repaint :p
    il suffit juste que je mette processEvents() apres update donc?
    Je vais tester

    Citation Envoyé par ness522 Voir le message
    Je pense que tu dois prendre en compte le nombre d'itération de ta boucle (10x, 1000x, ??) et le temps total de ton algorithme sans dessin, pour essayer de demander à Qt de forcer le dessin mais pas à chaque fois, pas à chaque tour de boucle. Par exemple, tu ne fais appel au repaint que toutes les 500 itérations, ça devrait te permettre d'avoir un compromis entre les deux solutions actuelles.
    oui c'est une bonne idée je vais regarder aussi de ce coté ci

    Citation Envoyé par ness522 Voir le message
    Plus compliqué, il est aussi possible de faire le calcul dans un thread, en parallèle. Tu aurais alors deux tâches qui fonctionnent le plus vite qu'elle peuvent mais qui fonctionnent en même temps :
    - le calcul de tes points
    - l'affichage de tes courbes
    Attention la mise en place des threads n'est pas triviale
    en effet je ne vais pas me lancer là dedans car je n'ai pas le temps (je suis censé avoir fini ce code depuis une semaine )


    merci pour toutes ces réponses

  12. #12
    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
    Citation Envoyé par ness522 Voir le message
    Qt ne te redessine pas le widget car il n'en a pas le temps. Il ne le fait qu'une fois le calcul terminé.
    Ce n'est pas qu'il n'as pas le temps, c’est qu' à aucun moment du traitement, Qt ne peut exécuter l'eventloop. L'update se retrouve bloqué jusqu'à la fin traitement, lorsque Qt reprend la main.

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut
    en fait pour chaque action de chaque pas de temps dans mon calcul je faisais un repaint()

    il suffit en fait d'en faire un seul par pas de temps

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

Discussions similaires

  1. Normes de programmation
    Par CanardJM dans le forum Débuter
    Réponses: 2
    Dernier message: 21/06/2004, 02h57
  2. Normes postgresql
    Par baboune dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 19/03/2004, 15h00
  3. Norme SQL ansi 92
    Par Superstivix dans le forum Langage SQL
    Réponses: 8
    Dernier message: 22/02/2004, 16h44
  4. wxWindows et DevC++ : taille de l'exe énorme !
    Par ovh dans le forum Dev-C++
    Réponses: 7
    Dernier message: 19/11/2003, 18h01
  5. Normes EDI
    Par f-demu01 dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 14/03/2003, 09h22

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