crossplatform.ru

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

> Рисование линий и память, QGraphicsScene и QLine
RazrFalcon
  опции профиля:
сообщение 7.7.2011, 18:14
Сообщение #1


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

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




Репутация:   212  


Рисую линии(график) так:
//в хедере
QList<QLineF> linesList;

//затем
linesList.append(QLineF(x1,y1,x2,y2));
scene->addLine(linesList.at(lineNumber),pen);
lineNumber++;
Или:
//в хедере
QList<QLineF*> *linesList;

// в конструкторе mainwindow
linesList = new QList<QLineF*>;
//затем
linesList.append(new QLineF(x1,y1,x2,y2));
scene->addLine(linesList.at(lineNumber),pen);
lineNumber++;

В обоих случаях утечка памяти. Рисуется по линии каждые 100мс. За 10 мин отжирает метров 10-20. Как исправить?
Точнее, как сделать так, что бы избавится от утечки памяти. При том, что мне, наверное, нужно хранить QList линий, что бы потом находит высоту в нужной точке графика посредством:
IntersectType QLineF::intersect ( const QLineF & line, QPointF * intersectionPoint ) const

Делаю это так:
QLineF *line1 = new QLineF(linesList->at(pos)->x1(), linesList->at(pos)->y1(),
                           linesList->at(pos)->x2(), linesList->at(pos)->y2());
QLineF line2(vLine->x(), 0, vLine->x(), scene->height());
QPointF intersectionPoint;
line1->intersect(line2, &intersectionPoint);
qDebug()<<intersectionPoint.y();


Уверен что есть более правильный способ.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Алексей1153
  опции профиля:
сообщение 8.7.2011, 6:21
Сообщение #2


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

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

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




Репутация:   34  


Цитата
Так как прога будет обновлять значения не чаще чем раз в пару секунд, а не каждые 100мс как сейчас, то думаю проблем не будет.


будут, поверь :)

А всего то нужно сделать следующее: (я названия методов QList не помню, сделаю аналогию на STL)

class MyLineShot
{
   std::vector<QLineF> m_vec;
   enum{e_max_size=1000;}//>1

   public:
   MyLineShot();
   void Append(const QLineF& l);
};

MyLineShot::MyLineShot()
{
   m_vec.reserve(e_max_size);
}

void MyLineShot::Append(const QLineF& l)
{
   межпоточный_синхронизатор.lock();  

   if( m_vec.size()>(e_max_size-1) )
   {
      const int to_del=m_vec.size()-(e_max_size-1);
      m_vec.erase(m_vec.begin(), m_vec.begin()+to_del);
   }

   m_vec.push_back(l);


   межпоточный_синхронизатор.unlock();  
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




RSS Текстовая версия Сейчас: 28.12.2024, 13:25