Bonjour,
Je suis en train de faire un système de log pour mon terrarium. Je veux collecter certaines données et les enregistrer dans un fichier toutes les 2 heures.
Pour faire ça, je lance simplement une boucle infini dans un thread avec une pause de 2h entre chaque itération.
Mais le delay ne se fait pas comme il devrait. Lorsque la fonction est appelée pour la première fois, la pause ligne 28 du cpp est comme ignorée et passe directement à la seconde boucle. Comportement incompréhensible. Je ne sais pas comment régler ce soucis, j'ai essayé de faire le delay avec la fonction sleep de linux mais j'ai même soucis.
Le programme tourne sur un rasperry pi 2
Je me suis permis de vous mettre en pièce jointe le code de la classe, elle n'est pas longue
Merci pour votre aide
Log.cpp :
log.h :Code:#include "Log.h" Log::Log(const std::string filename) : mFichierLog(filename, std::ios::app), mThreadLog(0), mEtat(true), mTemperature(0), mHygrometrie(0), mHumiditeSol(0), mFilename(filename) { mThreadLog = new std::thread(&Log::threadLog, this); } Log::~Log() { mEtat = false; mThreadLog->join(); delete mThreadLog; std::cout << "Arret de la gestion des logs" << std::endl; } void Log::threadLog() { while(mEtat) { std::this_thread::sleep_for(std::chrono::seconds(2*3600)); while(mTemperature*mHygrometrie*mHumiditeSol <= 0) { std::cout << "Log::threadLog() : Il n'y a pas de données Ã* enregistrer...Nouvel essai dans 10 secondes" << std::endl; std::this_thread::sleep_for(std::chrono::seconds(10)); } std::cout << "Log : nouvelles donnees" << std::endl; time_t now = time(0); struct tm today; today = *localtime(&now); std::string date = ctime(&now); trim(date); // ctime créer un saut de ligne Ã* la fin de la chaine : on les supprimer mFichierLog.open(mFilename, std::ios::app); mFichierLog << date << " " << mHygrometrie << ";" << mTemperature << ";" << mHumiditeSol << std::endl; mFichierLog.close(); reset(); } } void Log::setHygrometrie(float hygrometrie) { mHygrometrie = hygrometrie; } void Log::setTemperature(float temperature) { mTemperature = temperature; } void Log::setHumiditeSol(int humidite) { mHumiditeSol = humidite; } void Log::reset() { mTemperature = 0; mHygrometrie = 0; mHumiditeSol = 0; } void Log::trim(std::string& str) { str.erase(str.begin(), find_if(str.begin(), str.end(), [](char& ch)->bool { return !isspace(ch); })); str.erase(find_if(str.rbegin(), str.rend(), [](char& ch)->bool { return !isspace(ch); }).base(), str.end()); }
Code:#ifndef LOG_H #define LOG_H #include <string> #include <algorithm> #include <fstream> #include <cctype> #include <thread> #include <iostream> #include <thread> #include <chrono> class Log { public: Log(const std::string filename); void setHygrometrie(const float hygrometrie); void setTemperature(const float temperature); void setHumiditeSol(const int humidite); ~Log(); private: void threadLog(); void reset(); void trim(std::string &str); std::fstream mFichierLog; std::thread *mThreadLog; bool mEtat; float mTemperature, mHygrometrie; int mHumiditeSol; std::string mFilename; }; #endif
-----