Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: LARSn от Сентябрь 16, 2013, 17:59



Название: QTreeWidget зависает при частой вставке элементов
Отправлено: LARSn от Сентябрь 16, 2013, 17:59
 Здрасти))

Я новичок, так что сильно не пинайте)
Задача: в виджет состоящий из нескольких колонок необходимо добавлять строчки из другого потока. При этом частота добавления строк может быть оч большой (в другом потоке перехватываются пакеты, а виджете отображается инфа о пакете).

Проблема 1: при большой загруженности сетевой карты, т.е. при частом добавлении item'ом в QtreeWidget происходит зависание qtreeWidget намертво! (добавляю через addTopLevelItem).
Проблема 2: при длительной работе приложения постоянно растет объем потребляемой памяти (это как я понял связанно с тем что каждый item должен создаваться через new).
Посоветуйте как избавится от зависаний и растущего аппетита приложения???

Погуглил, и понял что вариантов несколько: 1) создавать свою модель данных 2) В теории можно переопределить событие перерисовки виджета и каким-то образом прорисовывать его не чаще чем раз в полсекунды или прорисовывать только когда скопится N новых item'ов (но только как это реализовать???) 3) Может я изначально не туда смотрю? может использовать не qtreewidget как элемент отображения пакетов??

P.s. в плане реализации потоков и их работы - там ошибок не может быть, т.к. все отлично работало C++Builder(Embrcadero)


Название: Re: QTreeWidget зависает при частой вставке элементов
Отправлено: voral от Сентябрь 16, 2013, 18:39
естественно объем занятой памяти будет расти - надо ж где то все это хранить.
Как вариант: Пишите в БД, а GUI через определенный интервал времени пусть запрашивает N последних записей (и оп ситуации либо отображаете только эти посление n записей либо дописывате эти N  уже загруженным). Если человек захочет прокрутить -тогда подгружаете сколько надо.

Опять же зависит от того что за задача. Может есть возможность  отфильтровать пакеты и отображать не все. Я в свое время делал при достижении определенного числа запсией поступаем следующим образом: при каждом добавлении строки - одну (самую старую удаляем). Естественно в БД, у меня тогда текстовый файл, храниться все.


Название: Re: QTreeWidget зависает при частой вставке элементов
Отправлено: mutineer от Сентябрь 17, 2013, 10:03
Переделай все на Model/View, в модель данные добавляй с любой нужной частотой, но вот оповещение о том, что в модели появились новые данные высылай с каким-нить интервалом. Например каждый 200мс

Или можешь в принимающем модуле собирать пакеты, а потом пачкой отправлять в модель, а не по одному

Память естественно растет - ты же все больше данных хранишь