Утечка памяти QTextEdit |
Здравствуйте, гость ( Вход | Регистрация )
Утечка памяти QTextEdit |
Anticross |
6.8.2010, 12:17
Сообщение
#1
|
Студент Группа: Участник Сообщений: 22 Регистрация: 31.3.2010 Пользователь №: 1579 Спасибо сказали: 0 раз(а) Репутация: 0 |
При добавлении каждой последующей строки в QTextEdit съедается оперативная память. Дело в том что я использую виджет в качестве лога программы и туда добавляются записи чуть ли не каждую секунду. Была идея организовать вывод таким образом:
1) выводить в виджет определенное количество строк 2) При привышении лимита сохранять содержимое виджета в файл и очищать содержимое виджета 3) При прокрутке вверх либо вниз подгружать соответсвующий файл в виджет. Может кто знает более простой(или правильный) способ. Подскажите пожалуйста. |
|
|
Алексей1153 |
6.8.2010, 12:28
Сообщение
#2
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
|
|
|
BRE |
6.8.2010, 12:29
Сообщение
#3
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Посмотри еще это: http://www.prog.org.ru/topic_14489_0.html
|
|
|
Алексей1153 |
6.8.2010, 12:43
Сообщение
#4
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
в любом случае, основная идкя - хранить данные в контейнере, там же и обрезать старые данные. А в виджет выводить не чаще, скажем, чем раз в секунду, выводя из контейнера текущие данные (а если не менялись - то и не выводить снова).
А ещё вопрос на засыпку - покажи ка код добавления строки, уж не из-за new QString без delete у тебя утечка ? Сообщение отредактировал Алексей1153 - 6.8.2010, 12:44 |
|
|
Anticross |
6.8.2010, 13:01
Сообщение
#5
|
Студент Группа: Участник Сообщений: 22 Регистрация: 31.3.2010 Пользователь №: 1579 Спасибо сказали: 0 раз(а) Репутация: 0 |
LogWidget.h
CODE #ifndef _LOGWIDGET_H_ #define _LOGWIDGET_H_ #include <QTextEdit> class LogWidget : public QTextEdit { //-------------------------------------------------------------------------------------------------- public: void error(const QString & msg) { setTextColor (WARNING_TEXT_COLOR); setFontWeight(QFont::Bold); append(QString("%1 : %2").arg(QTime::currentTime().toString("hh:mm:ss")).arg(msg)); } //-------------------------------------------------------------------------------------------------- public: void warning(const QString & msg) { setTextColor (WARNING_TEXT_COLOR); setFontWeight(QFont::Normal); append(QString("%1 : %2").arg(QTime::currentTime().toString("hh:mm:ss")).arg(msg)); } //-------------------------------------------------------------------------------------------------- public: void message(const QString & msg) { setTextColor (Qt::blue); setFontWeight(QFont::Normal); append(QString("%1 : %2").arg(QTime::currentTime().toString("hh:mm:ss")).arg(msg)); } //-------------------------------------------------------------------------------------------------- public: void debug (const QString & msg) { setTextColor (Qt::black); setFontWeight(QFont::Normal); append(QString("%1 : %2").arg(QTime::currentTime().toString("hh:mm:ss")).arg(msg)); } //-------------------------------------------------------------------------------------------------- }; #endif//_LOGWIDGET_H_ Log.h CODE #ifndef LOG_H #define LOG_H #include <QMutex> #define LOG_DEBUG Log::debug #define LOG_MESSAGE Log::message #define LOG_WARNING Log::warning #define LOG_ERROR Log::error class LogWidget; QT_BEGIN_NAMESPACE class QString; QT_END_NAMESPACE class Log { //-------------------------------------------------------------------------------------------------- private: static LogWidget * m_log; private: static QMutex m_mutex; //-------------------------------------------------------------------------------------------------- public: static void setLogWidget(LogWidget * wnd); //-------------------------------------------------------------------------------------------------- public: static void error (const QString & msg); public: static void warning(const QString & msg); public: static void message(const QString & msg); public: static void debug (const QString & msg); //-------------------------------------------------------------------------------------------------- }; #endif//LOG_H Log.cpp CODE #include "StdAfx.h"
LogWidget * Log::m_log = NULL; QMutex Log::m_mutex; //-------------------------------------------------------------------------------------------------- void Log::setLogWidget(LogWidget * log) { QMutexLocker locker(&m_mutex); m_log = log; } //-------------------------------------------------------------------------------------------------- void Log::error(const QString & msg) { QMutexLocker locker(&m_mutex); if (m_log == NULL) qWarning(msg.toAscii()); else m_log->error(msg); } //-------------------------------------------------------------------------------------------------- void Log::warning(const QString & msg) { QMutexLocker locker(&m_mutex); if (m_log == NULL) qWarning(msg.toAscii()); else m_log->warning(msg); } //-------------------------------------------------------------------------------------------------- void Log::message(const QString & msg) { QMutexLocker locker(&m_mutex); if (m_log == NULL) qWarning(msg.toAscii()); else m_log->message(msg); } //-------------------------------------------------------------------------------------------------- void Log::debug(const QString & msg) { QMutexLocker locker(&m_mutex); if (m_log == NULL) qDebug(msg.toAscii()); else m_log->debug(msg); } //-------------------------------------------------------------------------------------------------- |
|
|
Алексей1153 |
6.8.2010, 13:10
Сообщение
#6
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Хорошо, покажи пример того, как ты снаружи класса вызываешь метод
Log::message(const QString & msg) - как готовишь для него строку ? |
|
|
Anticross |
6.8.2010, 13:13
Сообщение
#7
|
Студент Группа: Участник Сообщений: 22 Регистрация: 31.3.2010 Пользователь №: 1579 Спасибо сказали: 0 раз(а) Репутация: 0 |
Посмотри еще это: http://www.prog.org.ru/topic_14489_0.html
Небольшой сложностью по сравнению с этим решением есть то что пользователю должен быть доступен весь текст. По этому если лишь ограничить блок выводимых данных старый текст утеряется, что непозволительно в моем случае. |
|
|
Алексей1153 |
6.8.2010, 13:17
Сообщение
#8
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Anticross, я смотрел. По твоим словам у тебя - лог сообщений, а это никак не хранение в контроле, это по меньшей мере
std::vector<QString*> или QList<QString*> а ещё лучше - кеш (в STL нету, я себе сам писал) насчёт того кода тебя пыатю - подоздеваю, что ты делаешь как-то так: myLog->message(new QString("12345")); отсюда может быть утечка. А иначе - это не утечка вовсе, а просто память то занимается потихоньку не удаляемыми данными Сообщение отредактировал Алексей1153 - 6.8.2010, 13:17 |
|
|
Anticross |
6.8.2010, 13:20
Сообщение
#9
|
Студент Группа: Участник Сообщений: 22 Регистрация: 31.3.2010 Пользователь №: 1579 Спасибо сказали: 0 раз(а) Репутация: 0 |
Собственно говоря вот :
LOG_MESSAGE("Some text or QString here"); |
|
|
Алексей1153 |
6.8.2010, 13:25
Сообщение
#10
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
|
|
|
Текстовая версия | Сейчас: 7.10.2024, 11:40 |