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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема: слишком медленное удаление объектов с канвы  (Прочитано 7718 раз)
Антонио
Гость
« : Декабрь 24, 2004, 17:00 »

Размещаю на канве (QCanvas) объекты - наследники классов QCanvasPolygon, QCanvasRectangle, QCanvasText
Количество колеблется от 20..2000.
Вывожу их в окно при помощи QCanvasView.
Удаляю их с канвы следующим кодом:
Код:

QCanvasItemList l = m_pCanvas->allItems();
for(QCanvasItemList::Iterator i = l.begin(); i != l.end(); i++)
{
    QCanvasItem* item = *i;
    delete *i;
}


Удаляется все достаточно медленно. Не катастрофично, но медленно. (когда кол-во объектов большое (1500), то около 10 сек) При этом создает и отрисовывает эту канву с объектами он гораздо быстрее...
Вообще надо этим заниматься или при закрытии окна Qt сама всю память освободит?
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #1 : Декабрь 26, 2004, 16:57 »

Тормоза:
1. STL вообще сама по себе тормозная конструкция. Qt реализация не исключение.

2. А не льзя ли не создавать кучу  QCanvasPolygon. Сделать один, отрисовать, и переопределить?

PS: Если не будешь удалять, то по логике все равно программа будет на выходе тормозить, для них деструктор вызывается
Записан
pilot.net
Гость
« Ответ #2 : Декабрь 27, 2004, 13:17 »

Цитата: "Антонио"
Размещаю на канве (QCanvas) объекты - наследники классов QCanvasPolygon, QCanvasRectangle, QCanvasText
Количество колеблется от 20..2000.
Вывожу их в окно при помощи QCanvasView.
Удаляю их с канвы следующим кодом:
Код:

QCanvasItemList l = m_pCanvas->allItems();
for(QCanvasItemList::Iterator i = l.begin(); i != l.end(); i++)
{
    QCanvasItem* item = *i;
    delete *i;
}


Я использую тотже код:
QCanvasItemList list = header->allItems();
for (   QCanvasItemList::Iterator it = list.begin();; it != list.end(); ++it) {
          if ( *it ) {
         (*it)->setVisible(false);
         delete *it;
      }

   }
   header->setAllChanged ();
   header->update ();
у меня все быстро удаляется а итемов и больше бывает, максимальная задержка 1-2 секунды
Записан
pilot.net
Гость
« Ответ #3 : Декабрь 27, 2004, 13:21 »

Цитата: "Admin"
Тормоза:
1. STL вообще сама по себе тормозная конструкция. Qt реализация не исключение.

2. А не льзя ли не создавать кучу  QCanvasPolygon. Сделать один, отрисовать, и переопределить?

PS: Если не будешь удалять, то по логике все равно программа будет на выходе тормозить, для них деструктор вызывается

1 - это не правда, генерится оптимальный код - если не верите посмотрите исходники
2- это опционально

ps - если деструктор явно не вызовется то никто его не вызовет, а при выходе просто эта память освободится операционной системой
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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