crossplatform.ru

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

> утечка памяти в QTableWidget + QSqlQuery
gmurik2
  опции профиля:
сообщение 27.5.2009, 11:57
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 21.5.2009
Пользователь №: 764

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




Репутация:   0  


Вот есть некий код

setActiveOrdersTable_Apply() {   
     QSqlQuery *query = new QSqlQuery();
    if(!query->exec(
                tr("SELECT ..."))) {
        QMessageBox::information(0,"Error", query->lastError().databaseText());
    }
    QString OrderState = "";
    int row;
    while(query->next()) {
        if(query->value(10).toString() != OrderState) {
            OrderState = query->value(10).toString();
            row = ui.ActiveOrdersTable->rowCount();
            ui.ActiveOrdersTable->insertRow(row);

            ui.ActiveOrdersTable->setSpan(row,0,1,ui.ActiveOrdersTable->columnCount());
            ui.ActiveOrdersTable->setItem(row,0,new QTableWidgetItem(query->value(10).toString()));
            ui.ActiveOrdersTable->item(row,0)->setTextAlignment(Qt::AlignCenter | Qt::AlignVCenter);
            ui.ActiveOrdersTable->item(row,0)->setFlags(Qt::NoItemFlags);
            ui.ActiveOrdersTable->item(row,0)->setBackgroundColor(QColor("#f9f99e"));
        }
        row = ui.ActiveOrdersTable->rowCount();
        ui.ActiveOrdersTable->insertRow(row);

        ui.ActiveOrdersTable->setItem(row,0,new QTableWidgetItem(query->value(0).toString()));
        ui.ActiveOrdersTable->item(row,0)->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
        ui.ActiveOrdersTable->item(row,0)->setFlags(Qt::ItemIsSelectable);

        и.т.п копипаст последних 3 строк
    }
    ui.ActiveOrdersTable->resizeRowsToContents();
    delete query;
}

далее по таймеру вызываю

void TaxSyst::updateActOrdersTable() {
    int selRow = ui.ActiveOrdersTable->currentRow();
    ui.ActiveOrdersTable->clearSpans();
        for(int i = ui.ActiveOrdersTable->rowCount(); i >= 0; i--) {
                for(int j = ui.ActiveOrdersTable->columnCount(); j >= 0; j--) {
                    delete ui.ActiveOrdersTable->item(i,j);
                }
                ui.ActiveOrdersTable->removeRow(i);
    }
        setActiveOrdersTable_Apply();
}


и соответственно идет утечка памяти по каждому срабатыванию таймера, подскажите где вилы зарыты :blink:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V   1 2 >  
Начать новую тему
Ответов (1 - 9)
kwisp
  опции профиля:
сообщение 27.5.2009, 12:33
Сообщение #2


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


gmurik2,
QList<QTableWidgetItem *> QTableWidget::findItems ( const QString & text, Qt::MatchFlags flags ) const
не пробовал?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
gmurik2
  опции профиля:
сообщение 27.5.2009, 13:04
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 21.5.2009
Пользователь №: 764

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




Репутация:   0  


Цитата(kwisp @ 27.5.2009, 15:33) *
gmurik2,
QList<QTableWidgetItem *> QTableWidget::findItems ( const QString & text, Qt::MatchFlags flags ) const
не пробовал?


Нет не пробовал, но честно говоря не совсем понял, чем мне это поможет
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 27.5.2009, 13:08
Сообщение #4


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


Цитата(gmurik2 @ 27.5.2009, 12:57) *
for(int i = ui.ActiveOrdersTable->rowCount(); i >= 0; i--) {
for(int j = ui.ActiveOrdersTable->columnCount(); j >= 0; j--) {
delete ui.ActiveOrdersTable->item(i,j);
}
ui.ActiveOrdersTable->removeRow(i);
}

вместо этого можно найти все элементы через
Цитата(kwisp @ 27.5.2009, 13:33) *
QList<QTableWidgetItem *> QTableWidget::findItems ( const QString & text, Qt::MatchFlags flags ) const

во флагах( Qt::MatchFlags) есть возможность использовать регулярные выраежния.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
gmurik2
  опции профиля:
сообщение 27.5.2009, 13:30
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 21.5.2009
Пользователь №: 764

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




Репутация:   0  


Придется, наверно, немного рассказать, что делает мой код:

в функции setActiveOrdersTable_Apply() происходит заполнение таблицы ActiveOrdersTable из запроса query.
далее эта таблица обновляется с некоторой периодичностью по сигналу таймера.

upTimer = new QTimer(this);
upTimer->start(5000);
connect(upTimer, SIGNAL(timeout()), SLOT(updateActOrdersTable()));


updateActOrdersTable()
удаляет все записи, из таблицы, и вызывает setActiveOrdersTable_Apply().

и наверно сделав QList<QTableWidgetItem *> QTableWidget::findItems ( const QString & text, Qt::MatchFlags flags ) const я получу те же яйца, только вид сбоку
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 27.5.2009, 13:48
Сообщение #6


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


Цитата(gmurik2 @ 27.5.2009, 14:30) *
и наверно сделав QList<QTableWidgetItem *> QTableWidget::findItems ( const QString & text, Qt::MatchFlags flags ) const я получу те же яйца, только вид сбоку


наверное получишь:)


а clearSpans()
зачем вызывается
после него интересно вообще доступ к элементу по ->item(int r,int c) осуществим?
если нет то вот это
Цитата(gmurik2 @ 27.5.2009, 12:57) *
for(int i = ui.ActiveOrdersTable->rowCount(); i >= 0; i--) {
for(int j = ui.ActiveOrdersTable->columnCount(); j >= 0; j--) {
delete ui.ActiveOrdersTable->item(i,j);
}
ui.ActiveOrdersTable->removeRow(i);
}

не сработает ниразу.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
gmurik2
  опции профиля:
сообщение 27.5.2009, 13:58
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 21.5.2009
Пользователь №: 764

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




Репутация:   0  


Цитата
а clearSpans()
зачем вызывается
после него интересно вообще доступ к элементу по ->item(int r,int c) осуществим?
если нет то вот это


доступ осуществим, а вызываю чтобы убрать объединения столбцов, потому как при следующем заполнении таблицы они остаются.
Но даже если убрать clearSpans() - память утекает со скоростью 16 кб в 5сек, т.е. с той же скоростью что и с ним ;)

может подойдем к решению вопроса другим путем, как заполнить QTableWidget данными и периодически их обновлять, но без проблемы утечки памяти?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 27.5.2009, 14:13
Сообщение #8


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


gmurik2,
а в циклах разве верно написано условие
Цитата(gmurik2 @ 27.5.2009, 12:57) *
(int i = ui.ActiveOrdersTable->rowCount(); i >= 0; i--)


пусть 4 строки. за номерами 0,1,2,3
а первая удаляемая будет за номером 4.
при таком раскладе .
поправь если я ошибаюсь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
gmurik2
  опции профиля:
сообщение 27.5.2009, 14:38
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 21.5.2009
Пользователь №: 764

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




Репутация:   0  


да действительно не верно :) И как винда это пропустила ;)

исправил
(int i = ui.ActiveOrdersTable->rowCount()-1; i >= 0; i--)

ситуация не изменилась... :(

пробовал чистить таблицу еще и так

for(int i = ui.ActiveOrdersTable->rowCount()-1; i >= 0; i--) {
                for(int j = ui.ActiveOrdersTable->columnCount()-1; j >= 0; j--) {
                    delete ui.ActiveOrdersTable->takeItem(i,j);
                }
                ui.ActiveOrdersTable->removeRow(i);
    }
        ui.ActiveOrdersTable->clear();
        setActiveOrdersTable_Apply();


тоже самое
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 27.5.2009, 14:50
Сообщение #10


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


gmurik2,
ну не знаю куда деваются 16Кб в 5 сек
1. воспользовавшись QTableWidget::findItems узнай размер списка всех элементов таблицы сравни с добавляемыми и удаляемыми если колличества равны то причина не в элементах.
2. проверь баг трекер троллей.
3. попробуй грохать всю таблицу и оцени результат может увидишь что-то полезное.
4. поищи по форуму схожие темы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 27.11.2024, 2:10