Partage
  • Partager sur Facebook
  • Partager sur Twitter

Broadcast avec multiple clients dans un QThread.

Sujet résolu
    21 novembre 2021 à 9:54:07

    Salut, j'ai un léger problème : je ne sais pas comment faire correctement une fonction broadcast avec Qt.
    J'ai une classe Server et des classes CP2PClientManagement.
    A chaque client qui se connecte sur le serveur, je fais :

    CP2PClientManagement*client{newCP2PClientManagement(handle)};
    connect
    (client,&CP2PClientManagement::finished,client,&QObject::deleteLater);
    connect
    (this,&TCPServerController::broadcast,client,&CP2PClientManagement::broadcast,Qt::DirectConnection);
    client
    ->start();

    Donc le client est mis dans un thread, et le CP2PClientManagement contient une fonction broadcast qui envoie un message au client.
    Tout fonctionne, mais dès que je souhaite broadcast, comme ceci Depuis la class Server:
    for(size_ti{0};i<g_peers.size();i++)
    {
        emit broadcast(msg);
    }

    bah ça fonctionne mais ça me met comme message d'erreur :
    QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
    Tous les clients ont reçu le message, mais j'ai ce petit warning et je ne sais comment le régler.

    Bien cordialement.

    -
    Edité par Loopite 21 novembre 2021 à 9:56:46

    • Partager sur Facebook
    • Partager sur Twitter
      25 novembre 2021 à 15:46:48

      Bonjour, toujours pas trouvé de moyen d'éviter cette erreur, pouvez vous m'aider svp.
      • Partager sur Facebook
      • Partager sur Twitter
        30 novembre 2021 à 14:45:58

        Bonjour,

        Si tu as cette erreur, tu accèdes probablement à une fonction du socket dans un thread différent de celui auquel appartient l'objet socket.

        Dans ta connexion de slot, le paramètre Qt::DirectConnection va faire que le slot va être appelé dans le même thread que celui où le signal a été émis, alors qu'avec Qt::QueuedConnection, le slot serait appelé dans le même thread que l'objet auquel il appartient.

        • Partager sur Facebook
        • Partager sur Twitter
          30 novembre 2021 à 17:03:39

          Salut, Comme tu me l'as conseillé j'ai bien fait :
          connect(this,&TCPServerController::broadcast,client,&CP2PClientManagement::broadcast,Qt::QueuedConnection); mais j'obtiens quand même l'erreur.

          Comment puis-je de ce fait y remédier ?
          • Partager sur Facebook
          • Partager sur Twitter
            1 décembre 2021 à 14:45:35

            Il faudrait déterminer dans quels threads se trouvent tes objets, en particulier CP2PClientManagement et QTcpSocket, si par exemple tu appelles les fonctions de QTcpSocket dans CP2PClientManagement alors que tu n'as pas déplacé le QTcpSocket (ou son QObject parent) avec sa fonction QObject::moveToThread dans le thread en question, ça provoque la même erreur.

            As-tu des appels à moveToThread dans ton code ? 

            Et pour être sûr que les sockets fonctionnent une fois déplacés, tes threads lancent-ils des boucles d'événements avec QThread::exec() (si elles surchagent QThread::run() sinon c'est déjà le cas) ? 

            • Partager sur Facebook
            • Partager sur Twitter
              1 décembre 2021 à 15:13:06

              Bonjour, j'ai fais quelque debug de mon côté, il s’avère que lorsque le client ce connecte, j'ai le currentThread CP2PClientManagement(0x2237380) (aucun message d'erreur lorsque j'écris dans le socket). Cependant dès que le slot broadcast est appellé j'ai quelque chose de complétement différent : QThread(0x2237321) pourtant le slot est dans la classe CP2PClientManagement.
              Par ailleurs, je n'ai pas d'appels de moveToThread dans mon code, je ne saurais où les mettre.
              Les sockets fonctionnent belles et bien après ce changement de current thread.

              Bien cordialement.

              -
              Edité par Loopite 1 décembre 2021 à 15:14:35

              • Partager sur Facebook
              • Partager sur Twitter
                16 décembre 2021 à 19:08:06

                alexisdm a écrit:

                Il faudrait déterminer dans quels threads se trouvent tes objets, en particulier CP2PClientManagement et QTcpSocket, si par exemple tu appelles les fonctions de QTcpSocket dans CP2PClientManagement alors que tu n'as pas déplacé le QTcpSocket (ou son QObject parent) avec sa fonction QObject::moveToThread dans le thread en question, ça provoque la même erreur.

                As-tu des appels à moveToThread dans ton code ? 

                Et pour être sûr que les sockets fonctionnent une fois déplacés, tes threads lancent-ils des boucles d'événements avec QThread::exec() (si elles surchagent QThread::run() sinon c'est déjà le cas) ? 

                En effet, j'ai testé ce que tu as conseillé. J'ai effectué correctement un move to thread en suivant l'esprit de ce tuto : https://www.youtube.com/watch?v=yazMHbIew0Q.

                Encore merci. Bien cordialement.

                • Partager sur Facebook
                • Partager sur Twitter

                Broadcast avec multiple clients dans un QThread.

                × 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