Bonjour,
J'ai un soucis avec QThread. Voilà le soucis:
Je suis en train d'écrire une système de log avec architecture : un LogManager qui contient les fonctions de log ( trace, warning , ... ) et une collection d'"engine" qui eux s'occupe d'écrire les logs proprement dit.
Les engines tourne dans un thread, chacun le leur et la communication entre le LogManager et les engines se fait via les signaux/slots.
Cependant j'ai un soucis, la mémoire vive utilisé par l'application explose et très rapidement ( avec une boucle infinie avec un trace("TEST") et 4 engines => 15 secondes = 1Go5 de mémoire prise ). J'ai donc pensé a une leak, sauf que il n'y a pas d'allocation dynamique dans le code.
Ci dessus des extraits de code:
La méthode pour ajouter un engine:
La méthode pour loguer:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 void LogManager::addLoggerEngine(QString engineName, LoggerEngine* engine) { m_loggerEngines.insert(engineName, engine); engine->moveToThread(thread); /* Work but cause a memory leak, had to fix that */ connect(this, SIGNAL(logMessage(LogManager::LogLevel, QList<QVariant>)), engine, SLOT(writeFormatted(LogManager::LogLevel, QList<QVariant>))); thread->start(); /* line that cause leak concern QDateTime::currentDate().ToString("format") */ emit loggerEngineAdded(engineName); }
Prototype du signal:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 void LogManager::log ( LogLevel level, const QList<QVariant> & args ) { emit logMessage(level, args); }
Un des slots: ( tous on le même soucis )
Code : Sélectionner tout - Visualiser dans une fenêtre à part void logMessage(LogManager::LogLevel level, QList<QVariant> args);
En sachant que si je commente ce code = plus de soucis
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 void ConsoleLoggerEngine::writeFormatted(LogManager::LogLevel level, QList<QVariant> messages ) { if(!m_isEnabled) return; if (messages.isEmpty()) return; if(!isLogLevelEnabled(level)) return; QString header = '[' + QTime::currentTime().toString("hh:mm:ss.zzz") + "] [" + LogManager::logLevelToString(level) + "] "; QString padding; *stdstream << header; padding.append(' '); int count = 0; Q_FOREACH(const QVariant& out, messages) { if (!out.isNull()) { if (count != 0) *stdstream << padding; *stdstream << out.toString(); } count++; } *stdstream << endl; }
Cordialement Mathieu
Partager