Partage
  • Partager sur Facebook
  • Partager sur Twitter

Afficher une valeur dans QLCDNumber

Qt et VS2019

    2 août 2019 à 10:14:40

    Bonjour à tous,

    Je "développe" (je bricole un truc quoi) un projet "Qt GUI Application" sous VS2019.

    J'aimerai afficher dans un QLCDNumber, une valeur que je récupère via un µC.

    Cette valeur est susceptible de changer et j'aimerai le voir dans le QLCDNumber. 

    Je ne sais pas du tout comment faire et voici ce à quoi j'ai pensé :

    - lire en continu ma valeur avec une boucle while(1) (risque de rester bloqué??)

    - ou envoyer un signal lorsque la valeur a changé et actualiser l'affichage

    Dans les deux cas, je ne sais pas trop comment m'y prendre et j'ai besoin d'un p'tit coup de pouce :)

    Pas de solution direct, j'ai plus envie d'avoir la bonne méthodo.

    Merci.

    Ioro

    -
    Edité par ThugYo 2 août 2019 à 10:56:48

    • Partager sur Facebook
    • Partager sur Twitter
      2 août 2019 à 11:01:16

      On ne sait pas comment le µC communique avec ton PC. Si c'est par liaison série par exemple, l'idéal est d'utiliser QSerialPort et d'exploiter le signal avertissant que des données sont arrivées. 

      Ca évite ainsi de scruter l'arrivées de nouvelles données et les éventuels blocages.

      • Partager sur Facebook
      • Partager sur Twitter
        2 août 2019 à 11:27:39

        Bonjour,

        J'ai une librairie fournie avec l'équipement qui me permet de lire la channel voulue. C'est une communication USB.

        • Partager sur Facebook
        • Partager sur Twitter
          2 août 2019 à 12:01:44

          Je ne comprends pas: tu parles d'équipement, donc ton PC communique avec cet équipement. Du coup que viens faire le µC là dedans?

          De plus, l'USB est peut-être gérée comme une liaison série, ce qui en simplifierait la gestion.

          Autre question, quelles sont les services proposés par cette bibliothèque?

          Bref, ton cahier des charges est trop vague et ma boule de cristal est en vacances. Pourrais-tu fournir des informations plus détaillées?

          • Partager sur Facebook
          • Partager sur Twitter
            2 août 2019 à 13:23:20

            J'ai un équipement avec un µC dessus et je communique en USB.

            La librairie fournit des fonctions de lectures/écritures sur une voie en particulier ou sur toutes les voies.

            Des fonctions de lecture/écriture en mode stream...

            • Partager sur Facebook
            • Partager sur Twitter
              2 août 2019 à 15:06:11

              Désolé, c'est trop vague.

              On ne connait rien de cette bibliothèque, donc comment connaitre son utilisation ...

              • Partager sur Facebook
              • Partager sur Twitter
                2 août 2019 à 15:11:26

                Récupérer la valeur c'est pas un problème....

                Mon problème c'est : "comment afficher la valeur en temps réel"

                • Partager sur Facebook
                • Partager sur Twitter
                  2 août 2019 à 15:23:21

                  Ce qu'il veut dire, c'est qu'on ne sait pas comment fonctionne ta lecture de valeur. Genre est-ce une fonction bloquante jusqu'à ce qu'elle aie une donnée ou est-ce qu'elle retourne directement une erreur si elle n'en a pas reçu et elle gère tout seul un buffer asynchrone ? Est-ce que le µC est configuré pour envoyer la donnée de lui même ou est-ce qu'à chaque fois que tu veux acquérir une donnée tu dois d'abord l'interrogé en émettant une trame ?

                  De ce que j'ai l'impression avec les questions que tu te poses, je penses que tu vas devoir faire les deux solutions que tu proposes x)
                  Tu crées un thread de réception qui ne fais que lire le flux et gérer un buffer, et lorsqu'il a constitué une donnée dans ce buffer, il émet un signal qui notifiera l'affichage dans le thread principal qui fera les mises à jour.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Dream on, Dream on, Dream until your dream comes true
                    2 août 2019 à 15:24:55

                    retour à la case départ: par un événement sur données reçues, mais comme on n'a aucune info sur ladite réception ...

                    Sinon, un palliatif: utiliser un QTimer et interroger régulièrement les canaux utilisés à chaque timeout

                    -
                    Edité par zoup 2 août 2019 à 15:33:56

                    • Partager sur Facebook
                    • Partager sur Twitter
                      2 août 2019 à 15:34:33

                      Ok j'avais mal compris les questions, navré.

                      Je sais pas dans les détails comment ça fonctionne mais en gros, je fais ça pour lire une valeur sur la channel voulue :

                      double AcqSys::ReadAIN(std::string AIN, double value)
                      {
                      	int Error=0;
                      	double readedValue = 0;
                      	Error = eReadName(m_AcqSys_Handle, AIN.c_str(), &value);
                      
                      	if (Error != NOERROR)
                      		qDebug() << "Erreur de lecture de la voie " << AIN.c_str();
                      	else
                      		readedValue = value;
                      
                      	return readedValue;
                      }

                      Pour le reste... Vous m'avez perdu ^^

                      • Partager sur Facebook
                      • Partager sur Twitter
                        2 août 2019 à 15:45:15

                        Si je comprends bien, ta bibliothèque est en fait une (ou plusieurs) classe, c'est çà?

                        Concernant ce qui t'a "perdu", quel est ton niveau de connaissance du framework Qt? Parce que ce dont je viens de parler fait partie des bases: événement, QTimer, etc.

                        Tu dois savoir que Qt, et en particulier en mode gui repose sur une gestion d'événement, et tout blocage risque de compromettre son fonctionnement, et de l'interface graphique particulièrement.

                        -
                        Edité par zoup 2 août 2019 à 15:46:46

                        • Partager sur Facebook
                        • Partager sur Twitter
                          2 août 2019 à 16:04:23

                          Niveau Qt, j'y connais pas grand chose... Je commence à peine à décrire des SIGNAL/SLOTS. Je déclenche une action après appuie sur un bouton! Wahou!!!

                          Niveau programmation, j'ai des notions mais rien de transcendant.

                          Mon programme à plusieurs classe oui. Après, j'ai juste un .h, qui me permet de communiquer avec mon équipement.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            2 août 2019 à 16:17:44

                            Je commence à peine à décrire des SIGNAL/SLOTS"

                            Ok, pour les signaux, tu vois ce dont je veux parler alors.

                            "Mon programme à plusieurs classe oui. Après, j'ai juste un .h, qui me permet de communiquer avec mon équipement."

                            Alors là je ne comprends plus à nouveau: ce que tu me montres est le code source de la classe AcqSys. Tu n'as donc pas qu'un .h.

                            En principe, lorsque le fabricant du matériel ne donne pas le .cpp, mais juste le .h, c'est qu'il fournit également la version compilée de la bibliothèque en .lib ou en .dll (pour Windows en l'occurrence). Est-ce le cas?

                            • Partager sur Facebook
                            • Partager sur Twitter
                              2 août 2019 à 16:24:15

                              zoup a écrit:

                              En principe, lorsque le fabricant du matériel ne donne pas le .cpp, mais juste le .h, c'est qu'il fournit également la version compilée de la bibliothèque en .lib ou en .dll (pour Windows en l'occurrence). Est-ce le cas?


                              Je dirais que c'est assez secondaire pour son problème, c'est surtout : est-ce qu'avec la lib ils ont fournit la doc ? :D
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Dream on, Dream on, Dream until your dream comes true
                                2 août 2019 à 16:34:57

                                AcqSys c'est une classe que j'ai développé. Et oui, j'ai bien un .dll.

                                Et la doc est fournie avec :)

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  2 août 2019 à 19:04:44

                                  romantik a écrit:

                                  zoup a écrit:

                                  En principe, lorsque le fabricant du matériel ne donne pas le .cpp, mais juste le .h, c'est qu'il fournit également la version compilée de la bibliothèque en .lib ou en .dll (pour Windows en l'occurrence). Est-ce le cas?


                                  Je dirais que c'est assez secondaire pour son problème, c'est surtout : est-ce qu'avec la lib ils ont fournit la doc ? :D

                                  Secondaire? Je ne pense pas. Je dirais au contraire que tout tourne autour de cette bibliothèque et de ses services.

                                  La doc est confidentielle?

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    3 août 2019 à 1:08:46

                                    Oui bien sûr, ce que je trouvais secondaire c'est la façon dont elle est linkée ^^"

                                    Que dit la doc sur eReadName ?

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Dream on, Dream on, Dream until your dream comes true
                                      5 août 2019 à 9:25:51

                                      Bonjour à tous,

                                      Lien vers la doc.

                                      J'ai utilisé un QTimer pour actualiser ma valeur. Mais admettons que j'ai plusieurs valeurs à actualiser sur la même fenêtre. Cela ne risque t-il pas de ralentir ou de générer des latences lors de l’exécution du programme?

                                      Par exemple, en changeant de vue, ou en déplaçant la fenêtre?

                                      Merci pour vos retours.

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        5 août 2019 à 10:56:11

                                        Effectivement tu peux ralentir ton application selon la vitesse de la communication, car ton programme va attendre que la donnée soit présente et puisque tu es dans le même thread (le thread principal, celui de l'UI) tu vas bloquer aussi toute interaction utilisateur.

                                        C'est pour ça que je te proposais de faire un thread de communication. Ainsi l'UI n'est pas bloquée et même si l'info n'arrive pas, l'utilisateur peut continuer à utiliser le logiciel.

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Dream on, Dream on, Dream until your dream comes true
                                          5 août 2019 à 11:23:17

                                          Ok merci pour l'info.

                                          Par contre, soit je me complique la vie, soit mon archi est un peu pourrie...

                                          Je m'explique, j'instancie dans ma classe de base (la classe de l'ui), une classe Device qui instancie tous mes équipements (DAQ, Camera, équipements RS232).

                                          Donc pour accéder à mes équipements, je crée des setters et des getters dans ma classe de base. Je suis pas sûr que ce soit la meilleur façon de faire...

                                          Par exemple pour lire et afficher une valeur je fais :

                                          connect(ui.timer, &QTimer::timeout, d->GetAcqSys(), &AcqSys::read);
                                          connect(ui.timer, &QTimer::timeout, this, &MainSoft::update);
                                          
                                          ui.timer->start(1);

                                          Puisque je ne peux pas faire appel à un slot avec argument, je créé le slot update :

                                          void MainSoft::update()
                                          {
                                            ui.lcdMonitorP->display(GetAcqSys_ui()->GetValue());
                                          }




                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            5 août 2019 à 11:38:24

                                            Alors dur de dire la meilleure façon de faire sans vraiment connaître le projet, par contre pour améliorer simplement ce petit bout, moi j'aurais tendance à rajouter un signal à AcqSys qui émet la valeur lue à la fin de AcqSys::read pour avoir quelque chose plus comme ça

                                            connect(ui.timer, &QTimer::timeout, d->GetAcqSys(), &AcqSys::read);
                                            connect(d->GetAcqSys(), &AcqSys::acquiredValue, this, &MainSoft::update);
                                            void MainSoft::update(double value)
                                            {
                                              ui.lcdMonitorP->display(value);
                                            }
                                            void AcqSys::read()
                                            {
                                              //...
                                              Error = eReadName(m_AcqSys_Handle, AIN.c_str(), &value);
                                              //...
                                              emit aquiredValue(value);
                                            }





                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Dream on, Dream on, Dream until your dream comes true
                                              9 août 2019 à 16:47:45

                                              Bonjour,

                                              Je viens de tester votre solution, c'est vraiment pas mal!

                                              Merci pour le bout de code!

                                              J'essaie plusieurs choses, je reviens vers vous si je bloque :)

                                              Un grand merci!

                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              Afficher une valeur dans QLCDNumber

                                              × 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