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 :

Bloquage de l'IHM

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2018
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2018
    Messages : 124
    Points : 55
    Points
    55
    Par défaut Bloquage de l'IHM
    Bonjour à tous,

    j'ai créé une IHM dans laquelle, il y a un bouton. lorsque je clique sur ce bouton, je rentre dans une boucle infinie pour venir lire en permanence une ligne série avec QSerialPort. Le problème est que forcement mon IHM est bloquée et que je ne peux rien faire.
    Comment puis-je faire pour alléger tout ça ? Est-il possible d'avoir une sorte de fonction d'interruption qui serait appelé lorsque je reçois un ou des données ?
    Si vous aviez un exemple de code, je suis preneur.

    Merci à tous

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 617
    Points : 188 587
    Points
    188 587
    Par défaut


    La solution privilégiée avec Qt est d'utiliser des signaux et des slots, plutôt que des boucles du genre : https://doc.qt.io/qt-5/qserialport.html#signals. Sinon, tu peux déporter l'exécution de cette boucle bloquante dans un fil d'exécution séparé (QThread).
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2018
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2018
    Messages : 124
    Points : 55
    Points
    55
    Par défaut
    Bonjour Dourouc05,

    le lien que tu m'as transmis, semble plutôt être lié au changement de configuration du port com que sur le fait de recevoir (ou envoyer) des nouvelles données.
    N'as-tu pas un simple bout de code pour que je comprenne comment le signal/slot pour le QSerial fonctionne ?

    Merci

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2018
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2018
    Messages : 124
    Points : 55
    Points
    55
    Par défaut
    J'ai essayé de mettre en place un système signal/slot, mais j'ai un petit problème
    Dans le mainwindow.cpp
    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
    17
     
    QSerialPort serial;
     
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
    ...
      connect(serial, SIGNAL(SerialReadData()), this, SLOT(readData()));
    }
     
    void MainWindow::SerialReadData()
    {
       QByteArray data = serial.readAll();
     
    ...
    }
    Et dans mainwindow.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    ...
    public slots:
        void SerialReadData();
    Le problème est que sur le "connect", il m'indique l'erreur suivant : "no matching member function for call to 'connect'"
    Que faut-il faire ?

    Merci

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2018
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2018
    Messages : 124
    Points : 55
    Points
    55
    Par défaut
    Je vais m'auto-répondre, mais sans pour l'instant avoir testé. Donc la déclaration global de "QSerialPort serial;" doit être fait dans la classe "class MainWindow : public QMainWindow" comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public:
        explicit MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
        QSerialPort *serial;
    Mais je dois tester tout ça à présent pour en être sûr.

  6. #6
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Bonjour,

    à priori tu as inversé signal et slots:
    Essaye:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(serial, SIGNAL(readData()), this, SLOT(SerialReadData()));
    Pour info, si tu es en c++11, tu peux utiliser les connects avec les lambdas, tu auras les erreurs de connect à la compilation, pas à l'execution.
    For crying out loud !

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2018
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2018
    Messages : 124
    Points : 55
    Points
    55
    Par défaut
    Non je n'ai pas inversé puisque maintenant cela fonctionne, et pour l'erreur, elle s'affiche directement sans avoir à compiler ou autre.

    Avant de marquer ce sujet comme résolu, je viens de faire des tests et ça fonctionne, il faut juste ajouter la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
    ...
      serial = new QSerialPort(this);
    En espérant que mon expérience de débutant puisse faire profiter quelqu'un d'autre

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2018
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2018
    Messages : 124
    Points : 55
    Points
    55
    Par défaut
    Autant pour moi PadawanDuDelphi, tu as raison, j'ai bien inversé malencontreusement.

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2018
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2018
    Messages : 124
    Points : 55
    Points
    55
    Par défaut
    Je me suis avancé trop vite en disant que cela fonctionne, ce qui fonctionne c'est que ça marche comme avant, mais cela ne fonctionne pas avec le signal/slot.
    Voici mon code :
    Dans mainwindows.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class MainWindow : public QMainWindow
    {
    ...
    private slots:
      void SerialReadData();
     
    private:
      QSerialPort *serial;
     
    ...
    Dans mainwindow.cpp
    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
     
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
    ...
      serial = new QSerialPort(this);
      connect(serial, SIGNAL(readData()), this, SLOT(SerialReadData()));
    }
     
    void MainWindow::SerialReadData()
    {
       QByteArray data = serial->readAll();
     
      ...
    }
    La compilation se passe bien, l’exécution aussi sauf qu'à la réception de données, la fonction "SerialReadData()" n'est jamais appelée, ce qui veut dire que le slot ne fonctionne pas.

    Quelqu'un saurait me dire pourquoi ?

    Merci

  10. #10
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 617
    Points : 188 587
    Points
    188 587
    Par défaut
    readData() n'est pas un signal, mais une méthode "normale" (on ne peut pas émettre readData) : mieux vaut utiliser readyRead() https://doc.qt.io/qt-5/qiodevice.html#readyRead.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  11. #11
    Membre du Club
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2018
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2018
    Messages : 124
    Points : 55
    Points
    55
    Par défaut
    dourouc05, tu es encore mon sauveur, merci c'est bien ça.
    Ce coup-ci, je mets en "résolu" ce sujet

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

Discussions similaires

  1. [java][IHM] bloquage de fenetre + thread(?)
    Par vince3320 dans le forum Interfaces Graphiques en Java
    Réponses: 9
    Dernier message: 13/02/2007, 15h32
  2. bloquage port par FAI
    Par djedjeboomboom dans le forum Développement
    Réponses: 6
    Dernier message: 18/08/2004, 11h02
  3. [SWT]mise a jour ihm SWT par un thread
    Par will82 dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 06/08/2004, 11h37
  4. [IHM] Enchainement des écrans
    Par CanardJM dans le forum Composants VCL
    Réponses: 6
    Dernier message: 22/06/2004, 16h01
  5. Problème : bloquage d'un pipe
    Par Nicaisse dans le forum POSIX
    Réponses: 10
    Dernier message: 24/07/2003, 11h06

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