crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Утечка памяти 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


фрилансер
******

Группа: Участник
Сообщений: 2933
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(Anticross @ 6.8.2010, 15:17) *
Может кто знает более простой(или правильный) способ. Подскажите пожалуйста


легко

Но сначала скажи - тебе нужно деление на строки или один сплошной текст с \r\n сойдёт ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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


фрилансер
******

Группа: Участник
Сообщений: 2933
Регистрация: 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


фрилансер
******

Группа: Участник
Сообщений: 2933
Регистрация: 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


фрилансер
******

Группа: Участник
Сообщений: 2933
Регистрация: 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


фрилансер
******

Группа: Участник
Сообщений: 2933
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Понятно. Остаётся

Цитата(Алексей1153 @ 6.8.2010, 16:17) *
А иначе - это не утечка вовсе, а просто память то занимается потихоньку не удаляемыми данными
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 2.12.2022, 15:28