Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Рисование линий и память
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Система рисования. Печать
RazrFalcon
Рисую линии(график) так:
//в хедере
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();


Уверен что есть более правильный способ.
Litkevich Yuriy
Цитата(RazrFalcon @ 7.7.2011, 21:14) *
Точнее, как сделать так, что бы избавится от утечки памяти.
а почему ты решил, что есть утечка?
Алексей1153
оператором new память из кучи выделал. А кто будет обратно в кучу вертать (delete) ?

А вообще, тут тебе нужен контейнер типа

QList<QLineF>
RazrFalcon
Цитата(Litkevich Yuriy @ 7.7.2011, 18:54) *
Цитата(RazrFalcon @ 7.7.2011, 21:14) *
Точнее, как сделать так, что бы избавится от утечки памяти.
а почему ты решил, что есть утечка?

Через 10 мин съело 20 метров. Прога будет работать круглосуточно, и графиков будет 8-м...


Цитата
А вообще, тут тебе нужен контейнер типа
QList<QLineF>

Самый первый код первого сообщения...
Та же беда.
Алексей1153
ладно. Тогда так:

linesList.append(QLineF(x1,y1,x2,y2));

а где очистка ? всегда только наполнение :)
RazrFalcon
<_<
Какая очистка?
Мне же нужен "лист"...
Или вы имеете ввиду "QLineF(x1,y1,x2,y2)", тогда я не знаю как его удалить =/
Litkevich Yuriy
Цитата(RazrFalcon @ 7.7.2011, 22:20) *
Через 10 мин съело 20 метров.
ну и что, ты в коде нигде линии не удаляешь, только добавляешь и всё.
Алексей1153
RazrFalcon, выведи в консоль значение linesList.size() и понаблюдай
mks
RazrFalcon ты по всей видимости отслеживаеш какой то длительный процесс и строишь его график. Твоя программа должна накапливать длительную статистику этого процесса (несколько суток или месяцев). Если я всё правильно понял, тогда в памяти в виде линий надо сохранять небольшой кусок этого графика, при поступлении новых данных старые удалять (можно сохранять на жёсткий диск) а новые добавлять, работать скользящим окном.
RazrFalcon
Да, я тоже думал про "скользящее окно", просто реализация будет по сложнее.
Но данные то все равно хранятся в БД, так что должно быть норм.

Цитата
выведи в консоль значение linesList.size() и понаблюдай
Угу, уже понял свою "ошибку".
Так как прога будет обновлять значения не чаще чем раз в пару секунд, а не каждые 100мс как сейчас, то думаю проблем не будет.
Алексей1153
Цитата
Так как прога будет обновлять значения не чаще чем раз в пару секунд, а не каждые 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();  
}
RazrFalcon
Я STL не знаю. <_<
Алексей1153
RazrFalcon, контейнеры Qt имеют похожий интерфейс

суть в том, чтобы перед добавлением обеспечить такой размер контейнера, чтобы после добавления размер не стал больше заданной величины
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.