Bonjour à tous
J'ai un programme qui tourne sur raspberry pi 2 dans le but de gérer mon terrarium grâce à différents capteurs.
J'ai créé un thread pour chaque capteurs, ils sont initialisés dans le constructeur de la classe Terrarium.
Comme le programme repose sur la lecture des capteurs, j'appelle la méthode join() sur chaque thread mais quand j'appelle les join par la méthode Terrarium::loop(), le programme cesse de fonctionner brutalement, il semblerait juste avant l'appelle de loop(). En revanche si je mets les join() dans le constructeur il n'y a pas de soucis.
Terrarium.cpp
main.cppCode:Terrarium::Terrarium() : _mf_eclairage(false), _mf_brumisateur(false), _dht(PIN_DHT22), _lcd(0x27), _log("/var/www/terrarium.log"), _threadDht22(0), _threadHumiditeSol(0) { _dht.setListeners(this); _lcd.init(); //on creer un thread pour recevoir les infos de la sonde dht22 _threadDht22 = new thread(&Terrarium::thread_watching_dht22, this); //on creer un thread pour recevoir les infos du capteur d'humidite du sol _threadHumiditeSol = new thread(&Terrarium::thread_watching_humidite_sol, this); //on défini les heures d'allumage et d'extinction de l'éclairage time_t now = time(0); struct tm today; today = *localtime(&now); struct tm soirStart; soirStart = *localtime(&now); soirStart.tm_hour = 18; soirStart.tm_min = 30; soirStart.tm_sec = 0; if(soirStart.tm_hour < today.tm_hour) { soirStart.tm_mday++; } struct tm soirEnd; soirEnd = *localtime(&now); soirEnd.tm_hour = 22; soirEnd.tm_min = 0; soirEnd.tm_sec = 0; if(soirEnd.tm_hour < today.tm_hour) { soirEnd.tm_mday++; } struct tm matinEnd; matinEnd = *localtime(&now); matinEnd.tm_hour = 9; matinEnd.tm_min = 0; matinEnd.tm_sec = 0; if(matinEnd.tm_hour < today.tm_hour) { matinEnd.tm_mday++; } struct tm matinStart; matinStart = *localtime(&now); matinStart.tm_hour = 6; matinStart.tm_min = 30; matinStart.tm_sec = 0; if(matinStart.tm_hour < today.tm_hour) { matinStart.tm_mday++; } //on lance le thread qui gère l'éclairage //Eclairage eclairage(&matinStart, &matinEnd, &soirStart, &soirEnd, this); //eclairage.start(); Eclairage eclairage; eclairage.initCrontab(); eclairage.deleteCrontab(); eclairage.addCronTask(&soirStart, true); eclairage.addCronTask(&soirEnd, false); eclairage.addCronTask(&matinStart, true); eclairage.addCronTask(&matinEnd, false); eclairage.validCrontab(); /*_threadDht22->join(); _threadHumiditeSol->join();*/ } void Terrarium::loop() { cout << "boucle thread" << endl; _threadDht22->join(); _threadHumiditeSol->join(); }
En espérant avoir été clair, je vous remercie d'avance pour votre aideCode://includes... Terrarium *terrarium; int main(int argc, char *argv[]) { signal(SIGINT, onAbort); /* ............ */ terrarium = new Terrarium(); terrarium->loop(); while(true); //boucle infini return 0; }
-----