Russian Qt Forum
Сентябрь 30, 2024, 08:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTreeWidget зависает при частой вставке элементов  (Прочитано 2420 раз)
LARSn
Гость
« : Сентябрь 16, 2013, 17:59 »

 Здрасти))

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

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

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

P.s. в плане реализации потоков и их работы - там ошибок не может быть, т.к. все отлично работало C++Builder(Embrcadero)
Записан
voral
Гость
« Ответ #1 : Сентябрь 16, 2013, 18:39 »

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

Опять же зависит от того что за задача. Может есть возможность  отфильтровать пакеты и отображать не все. Я в свое время делал при достижении определенного числа запсией поступаем следующим образом: при каждом добавлении строки - одну (самую старую удаляем). Естественно в БД, у меня тогда текстовый файл, храниться все.
Записан
mutineer
Гость
« Ответ #2 : Сентябрь 17, 2013, 10:03 »

Переделай все на Model/View, в модель данные добавляй с любой нужной частотой, но вот оповещение о том, что в модели появились новые данные высылай с каким-нить интервалом. Например каждый 200мс

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

Память естественно растет - ты же все больше данных хранишь
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.121 секунд. Запросов: 20.