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:
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:
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.