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 chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 539
    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
    Invité
    Invité(e)
    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);

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 539
    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
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    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 chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 539
    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, 19h00
  2. Réponses: 0
    Dernier message: 03/09/2012, 21h23
  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, 11h26
  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, 19h40
  5. Réponses: 20
    Dernier message: 14/09/2006, 10h56

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