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

Threads & Processus C++ Discussion :

Erreur de compilation lors de l'instanciation d'un thread


Sujet :

Threads & Processus C++

  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    juin 2004
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : juin 2004
    Messages : 385
    Points : 324
    Points
    324
    Par défaut Erreur de compilation lors de l'instanciation d'un thread
    Bonjour,

    je vous présente rapidement le contexte:
    - je travaille avec Qt sous Debian pour une application console.
    - Le programme doit gérer un esclave modbus (donc un serveur) qui doit se mettre à l'écoute de toute requête. Comme l'attente est bloquante et que je ne veux pas bloquer la boucle de gestion des événements de Qt, je compte exécuter l'écoute dans un thread.
    - ci-dessous le bout de code de ma classe "Slave" en question:
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    void Slave::listen(){
        socket = modbus_tcp_listen(ctx, 1); // Attend une demande de connexion du client.
        connect(this, &Slave::requestGood, this, &Slave::incomingRequest);
        connect(this, &Slave::threadFinished, this, &Slave::connectionLost);
     
        std::thread requestThread(&Slave::waitForRequest);
        requestThread.detach();
    } 
     
    void Slave::waitForRequest(){
        modbus_tcp_accept(ctx, &socket);
        // Le thread ne se termine pas et ne fait qu'attendre l'arrivée de requêtes
        int requestLength;
        for (;;){
            do {
                requestLength = modbus_receive(ctx, query);
                qDebug() << "Longueur de la requête :" << requestLength;
            } while (requestLength == 0);
     
            if (requestLength == -1){
                qDebug() << "Erreur dans la requête reçue ou perte de connexion";
                qDebug() << errno << ": " << modbus_strerror(errno);
                if (errno == 104) // perte de la connexion
                    break;  // Termine le thread
            }
            emit requestGood(requestLength);
        }
        close(socket); // On ferme la socket ...
        // ... et le thread se termine
        emit threadFinished();
     
    }
    Je reçois plusieurs erreurs dont la 1ère est localisée dans le fichier d'entête de la classe std::thread:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /usr/include/c++/8/thread:120: erreur : static assertion failed: std::thread arguments must be invocable after conversion to rvalues  static_assert( __is_invocable<typename decay<_Callable>::type,
                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
               typename decay<_Args>::type...>::value,
               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /usr/include/c++/8/thread:132: required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (Slave::*)(); _Args = {}; <template-parameter-1-3> = void]’
    /home/pi/Programmes/testModbusSlave/modbusSlave/slave.cpp:39: required from here
    La ligne 39 du message d'erreur correspond à la ligne 6 de l'extrait de mon code ci-dessus.

    Je n'arrive pas à interpréter cette erreur. Il me semble bien comprendre que c'est lié aux paramètre du thread, mais en l'occurrence je n'en ai pas.

    Je vous remercie d'avance pour l'aide que vous pourrez m'apporter.

  2. #2
    Modérateur

    Avatar de Winjerome
    Homme Profil pro
    Inscrit en
    septembre 2009
    Messages
    10 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : septembre 2009
    Messages : 10 704
    Points : 65 902
    Points
    65 902
    Par défaut
    Bonjour,

    Une fonction membre ne peut être appelée que par le biais d'une instance, instance qu'il te faut passer en même temps que son pointeur au constructeur de std::thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::thread requestThread(&Slave::waitForRequest, this);
    Avant de poser votre question : FAQ, Tutoriels et recherche sur le forum
    Une erreur ? Messages d'erreur et avertissements
    "Ça ne marche pas" n'apporte aucune information utile permettant de vous aider. Expliquez clairement votre problème (erreurs entières, résultat souhaité vs obtenu...).
    En essayant continuellement on finit par réussir. Donc: plus ça rate, plus on a de chance que ça marche. - Jacques Rouxel
    L'expérience, c'est le nom que chacun donne à ses erreurs - Oscar Wilde
    Mes extensions FireDVP (Firefox), ChroDVP (Chrome) : suivi des nouveaux messages, boutons/raccourcis et bien plus !

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    juin 2004
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : juin 2004
    Messages : 385
    Points : 324
    Points
    324
    Par défaut
    Merci beaucoup, ça fonctionne maintenant.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    juin 2010
    Messages
    6 634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 6 634
    Points : 30 338
    Points
    30 338
    Billets dans le blog
    4
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    juin 2004
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : juin 2004
    Messages : 385
    Points : 324
    Points
    324
    Par défaut
    Merci pour cette précision.

    Je ne pense pas que cela puisse s'appliquer dans ce cas. J'ai utilisé le terme "socket" dans mon code car c'est celui qui était utilisé dans la doc de la bibliothèque et qu'il me semblait correspondre à cette variable.
    La bibliothèque libmodbus masque l'utilisation des socket et ma socket est plutôt un descripteur de fichier à mon avis (il faudrait consulter les source de la bibliothèque). En tout cas, c'est un entier.

    J'aurais bien aimé que la bibliothèque propose le mode non bloquant.

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

Discussions similaires

  1. Erreur de compilation lors d'un bitwise_and
    Par PandaInso dans le forum OpenCV
    Réponses: 2
    Dernier message: 27/11/2013, 20h00
  2. Réponses: 0
    Dernier message: 03/09/2012, 22h23
  3. Erreur de compilation lors d'appel d'autre classe
    Par DevLib dans le forum Débuter avec Java
    Réponses: 14
    Dernier message: 28/07/2011, 12h26
  4. [EJB3] Erreur de compilation lors de l'ajout des annotations
    Par rabebIF5 dans le forum Java EE
    Réponses: 4
    Dernier message: 05/04/2009, 20h40
  5. Réponses: 20
    Dernier message: 14/09/2006, 11h56

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