Partage
  • Partager sur Facebook
  • Partager sur Twitter

Affichage d'une position en continu Qt

    8 avril 2021 à 19:09:23

    Bonjour,

    Pour une application où je pilote un moteur via une interface graphique, j'aimerais acquérir la position du moteur en continu et l'afficher.

    Je l'ai fait en déclarant des signaux/slots qui vont bien avec un QTimer qui toutes les 100ms demande la position et je l'affiche ensuite.

    Le problème majeure que je rencontre avec cette méthode est que cela ralentit énormément mon interface (actions déclenchées avec latence)

    Code classe principale :

    timer = new QTimer(this);
    m_timer->start(100);
    
    QObject::connect(m_timer, &QTimer::timeout, m_motion, &Motion::UpdatePosition, Qt::ConnectionType::UniqueConnection);
    QObject::connect(m_motion, &Motion::updatePosition, this, &UI::UpdatePosition, Qt::ConnectionType::UniqueConnection);

    void UI::UpdatePosition(double pos)
    {
    	ui.le_Pos->setText(QString::number(pos, 'g', 12));
    }

    Code classe Motion :

    void Motion::UpdatePosition()
    {
    emit updatePosition(GetPosition(m_MotionID)); }

    Avez-vous une astuce pour que cela ne ralentisse pas les interactions avec l'interface svp?

    D'avance, merci.

    TY



    • Partager sur Facebook
    • Partager sur Twitter
      9 avril 2021 à 6:07:53

      Est ce que vous savez ce qui ralentit l'interface ?

      J'imagine qu'il y a deux options:

      Option 1: Les signaux/slots de Qt sont lents

      Option 2: Récupérer la position avec la fonction GetPosition() prend énormément de temps

      Je pense que répondre à cette question est essentiel pour trouver une solution valable. Dans le cas où GetPosition() est le bottleneck, une autre manière de procéder serais d'avoir un autre thread qui ferait en continu le polling de la position du moteur, avec une variable globale pour retenir la dernière position, et un mutex pour la protéger des accès concurrents. Comme ça une partie du travail est délegué à un autre thread et l'interface graphique devient plus réactive.

      • Partager sur Facebook
      • Partager sur Twitter
        9 avril 2021 à 10:01:59

        Je viens de lire pas mal de doc sur le QThread et le QMutex.

        Si j'ai bien compris, je dois créer une classe dérivée de QThread qui contient en attribut mon objet Motion, réimplementer la fonction run() pour faire l'acquisition de la position en continue et mettre en place le mécanisme Signaux/Slots qui va bien?

        EDIT :

        Dans mon code j'utilise déjà des QThreads de cette façon :

        QThread* DAQ_Thread = new QThread;
        QThread* Motion_Thread = new QThread;
        	
        		
        m_DAQ_ui->moveToThread(DAQ_Thread);
        m_Motion_ui->moveToThread(MotionSample_Thread);
        	
        DAQ_Thread->start();
        Motion_Thread->start();
        

        Mais ça ne résout pas mes problèmes de ralentissement. Et d'après plusieurs doc, je devrais déclarer mes QObject::connect entre moveToThread Et start(), alors que mes connexions sont déclarées plus haut dans le code.

        ça peut venir de ça?

        Pouvez-vous me donner un exemple de code selon les deux approches car j'ai pas bien compris la différence...

        Merci

        -
        Edité par ThugYo 9 avril 2021 à 10:24:51

        • Partager sur Facebook
        • Partager sur Twitter
          12 avril 2021 à 17:47:17

          Pardon pour la réponse tardive. Avant de faire quoi que ce soit pour solutionner le problème, il faut être certain de la nature du problème. Dans mon précédent message je suggérais de passer le code au profiler pour voir combien de temps GetPosition() a besoin pour s'exécuter.

          Je n'ai jamais utilisé Qt Creator pour du profiling (j'utilise Visual Studio) mais apparemment ils ont un outil qui a l'air puissant: https://doc.qt.io/qtcreator/creator-cpu-usage-analyzer.html

          Le résultat du profiling va clairement mettre en lumière les éventuels bottlenecks dans le code. Une fois le problème clairement cerné, il sera plus simple de trouver une solution qui fonctionne.

          • Partager sur Facebook
          • Partager sur Twitter
            20 avril 2021 à 15:32:57

            Hello,

            Réponse tardive pour moi aussi. J'utilise aussi VS pour coder. Avez-vous un outil à utiliser avec VS?

            D'avance, merci.

            TY

            • Partager sur Facebook
            • Partager sur Twitter

            Affichage d'une position en continu Qt

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown