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:
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
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(); }
La ligne 39 du message d'erreur correspond à la ligne 6 de l'extrait de mon code ci-dessus.
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
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.
Partager