Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Ubuntu_linux от Октябрь 28, 2011, 15:54



Название: Обязательно ли удалять поток чтоб освободить память?
Отправлено: Ubuntu_linux от Октябрь 28, 2011, 15:54
Просто запускаю/приостанавливаю поток но память увеличивается, надо удалять поток?


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: Странник от Октябрь 28, 2011, 18:03
надо ли удалять объект, чтобы освободить память?


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: Ubuntu_linux от Октябрь 28, 2011, 19:36
надо ли удалять объект, чтобы освободить память?
Тонкий намек? ;)


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: thechicho от Октябрь 28, 2011, 21:04
красноглазик, выложи, плиз, код, как ты с потоком работаешь. старт, пауза, удаление.


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: Ubuntu_linux от Октябрь 29, 2011, 02:23
Та ничего особого, просто в функции run() запускаю процес отрисовки QPainter-ом на QImage текст + картинки. Пока даже до паузи недошел, просто стартую поток когда поступает новая задачка MyThread->start(). В итоге получаю +2МБ за отрисовку в оперативную память и таким образом она засоряется... :(

Код
C++ (Qt)
void PdfPreview::run(){
   while(!obj->pageList.isEmpty()){
       if(!m_stopped){
           obj->displayPage(obj->pageList.at(0),m_dpi);
           obj->pageList.removeAt(0);
       }//if m_stoped
       else{break;}
       }//while
  }//run


Методом тика нашел что вот эта зараза во всем виновата:
Код
C++ (Qt)
if ( fsize > 0){m_painter-> drawText (QPointF(x1,y1), str );}

Причем если нарисовать сразу 10 QImage (страниц) то все в порядке, а если по одной то получаю +2МБ в оперативную память :(

Что делать с m_painter-> drawText ?


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: Bepec от Октябрь 31, 2011, 09:12
Кхм. конечно мб я наивен, а вы случаем не запускаете каждый раз новый поток?

При каждом последующем вызове потока соответственно будет утекать память.

PS код пжалста предъявите, гражданин.


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: Akon от Октябрь 31, 2011, 09:58
deep copy QImage?


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: andrew.k от Октябрь 31, 2011, 13:49
Кхм. конечно мб я наивен, а вы случаем не запускаете каждый раз новый поток?

При каждом последующем вызове потока соответственно будет утекать память.
Почему это?


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: Bepec от Октябрь 31, 2011, 14:10
Цитировать
Пока даже до паузи недошел, просто стартую поток когда поступает новая задачка MyThread->start().

Помоему он не стопит поток, а просто каждый раз вызывает новый, хотя и не видел кода, но предполагаю (что он вызывает каждый раз все заного и заного).

Конечно можно истолковать по разному, но если он каждый раз start вызывает, причем не выводя из цикла уже созданный поток, то...

Помоему рождается новый цикл, который соответственно работает параллельно со старым.

Уж не буду ручаться за эти рассуждения, но эта версия вкупе с цитатой кажется наиболее вероятным развитием хода его программы.

Таким образов вызывая и вызывая функцию он и засоряет память кучей циклов со своими элементами.

PS поправьте меня, если ошибаюсь.

To andrew.k:
Память будет не теряться(ибо можно остановить эти циклы), но соответственно каждая новая копия требует снова и снова ресурсов/мощности. И получается так называемая утечка памяти. Возможно и контролируемая, но утечка.


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: andrew.k от Октябрь 31, 2011, 14:16
Ты ошибаешься. Если поток уже работает, то метод start() ничего не делает.
Смотри ассистент.


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: Bepec от Октябрь 31, 2011, 14:26
Кхм. повторюсь тогда (просил поправить - поправили, спасибо :) )

Цитировать
Пока даже до паузи недошел, просто стартую поток когда поступает новая задачка MyThread->start().

Почитал, действительно старт ничего не сделает, но тогда как ув.Ubuntu_linux стартует поток? :)

К сожалению мой мозг уже заражен идеей дублирования потоков и предлагает вариант - он все же создает новые и новые потоки и стартует их :)

PS ну код тут нужен, а спорить можно до посинения :)


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: andrew.k от Октябрь 31, 2011, 15:08
Ясно, что по отдельному экземпляру на отдельный поток. Иначе бы у него просто не было потоков.
Так же ясно, что удалять поток не нужно после завершения, а можно запустить повторно.
У него проблема в другом, это уже выяснено и обсуждается в другой теме.


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: Bepec от Октябрь 31, 2011, 15:23
 И в той и в этой ни 1 куска кода :) Он что тренирует интуицию у вас? :)


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: Ubuntu_linux от Октябрь 31, 2011, 19:21
Проблема решена!
Я не делал новый поток каждый раз, а просто стартовал поток, после того как он завершыт свое дело. А проблема оказалась в повторяющемся вызове старта до завершения, как я полагаю.
Код приведен пару постов выше...


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: andrew.k от Октябрь 31, 2011, 19:38
В этом не могло быть проблемы.
О чем я писал выше.
Повторный вызов старт ничего не делает.

"If the thread is already running, this function does nothing."
QThread (http://doc.qt.nokia.com/latest/qthread.html#start)


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: Ubuntu_linux от Октябрь 31, 2011, 20:11
В этом не могло быть проблемы.
О чем я писал выше.
Повторный вызов старт ничего не делает.

"If the thread is already running, this function does nothing."
QThread (http://doc.qt.nokia.com/latest/qthread.html#start)
Так у меня хитрая система и может в список отображения добавиться уже существующая страничка pageList.append(page);


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: andrew.k от Октябрь 31, 2011, 22:26
Какая хитрая? ты потоки через QThread делал? значит start работает как описано.


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: Ubuntu_linux от Ноябрь 01, 2011, 03:10
Какая хитрая? ты потоки через QThread делал? значит start работает как описано.
Страничка в список может добавиться в любой момент вне потока.


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: andrew.k от Ноябрь 01, 2011, 08:22
Не понятно, как это связано с запуском потока.


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: Ubuntu_linux от Ноябрь 02, 2011, 23:04
Не понятно, как это связано с запуском потока.
Я тоже не понял до конца.
 И вот проблема вернулась!
Картинки ресует нормально но при рендере текста память засерается опять.


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: Bepec от Ноябрь 03, 2011, 07:12
Аррр!!! *рвет поседевшие от Ubuntu_linux волосы*

КОООД!
МАЯ НУЖНА КОООД!

скинь ты блин файл, полностью, где ты загружаешь текст/отрисовываешь/создаешь потоки.

Ну если жалко - так и скажи, тебе ж люди популярно объяснять пытаются, а ты кусок кода выложить ленишься.

Код - это когда я могу его скопировать в *.cpp, добавить переменные в *.h  т скомпилировать и таки чтоб все заработало, а не кусок бесполезного бессвязного текста.

У тебя блин все плохо, но код то покажи, тут люди разумные сидят - посмотрят, проверят и скажут тебе, что и как, баг или так, ты сделал или Qt подсобила.


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: SASA от Ноябрь 03, 2011, 17:19
ХЛЕБА И КОД НАРОДУ!!! ;D

Извините за снобизм, сам безграмотный, но очень режет глаза.

Цитировать
после того как он завершыт свое дело.


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: Igors от Ноябрь 03, 2011, 17:48
Цитировать
после того как он завершыт свое дело.
То еще цветочки. Один раз этот автор написал
Цитировать
Надо было попробивать
Я никак не мог сообразить что "пробивать"-то? И только потом дошло - это "попробывать" с перепутанным "ы". А ведь вполне грамотный, культурный человек - просто дурачится. Поскольку С++ и русский - практически одно и то же, то подозреваю что поэтому исходники выложить стесняется. В общем, стал жертвой собственного остроумия  :)
 


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: thechicho от Ноябрь 03, 2011, 18:38
http://lurkmore.ru/Grammar_nazi x2 *FUUUUUUUUU*


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: Igors от Ноябрь 03, 2011, 19:10
http://lurkmore.ru/Grammar_nazi x2 *FUUUUUUUUU*
Чувак, ну ты эта, кароч - не утомляй придурковатой ссылкой чо ты суешь уже пятый раз.
Ты сильно "деловой" (читай - наглый). пипл таких не любит


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: andrew.k от Ноябрь 03, 2011, 19:53
http://lurkmore.ru/Grammar_nazi x2 *FUUUUUUUUU*
ты не путай жопу с пальцем.
мелкие ошибки бывают, от усталости, от новнимательности и других факторов.
"а кагда чиловек делает невозможные ошыбки." это другое.


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: thechicho от Ноябрь 03, 2011, 20:12
// Извините за снобизм, сам безграмотный, но очень режет глаза.

меня тошнит от этой фразы. уверен на 99% - это лицемерие в чистом виде.


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: thechicho от Ноябрь 03, 2011, 20:15
если бы эт был форум задротов грамотности, тогда бы это было уместно. а так лицемерие, ИМХО. а от лицемеров с их "принципами" блювать хочется  :D


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: thechicho от Ноябрь 03, 2011, 20:17
// пипл таких не любит
а чо эт ты о себе во множественном числе заговорил?  :D


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: andrew.k от Ноябрь 03, 2011, 20:36
заканчивай.


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: Ubuntu_linux от Ноябрь 04, 2011, 04:48
Ну поймите, кода очень много... где-то на 5-10 минут компиляции и там много ненужного хлама...
Я вот думаю, у меня на каждую страничку свой qimage на котором рисует пейнтер, мож в этом
загвоздка с drawText ?


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: andrew.k от Ноябрь 04, 2011, 12:02
Загвоздка в том, что ты задаешь слишком неопределенные вопросы без подкрепления их участками кода.


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: thechicho от Ноябрь 04, 2011, 14:34
может те QtConcurrent лучше заюзать, кстати говоря.

Код
C++ (Qt)
#include <QtGui/QApplication>
#include <QFuture>
#include <QtConcurrentRun>
 
void hello()
{
   qDebug() << "Hello from thread " << QThread::currentThread();
}
 
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
 
   QFuture<void> future = QtConcurrent::run(hello);
   qDebug() << "hello from GUI thread " << QThread::currentThread();
   future.waitForFinished();
   return 0;  
}

в hello() реализуешь
Цитировать
запускаю процес отрисовки QPainter-ом на QImage текст + картинки
и не надо еб с потоками  :D


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: Ubuntu_linux от Ноябрь 04, 2011, 20:06
Сделал все в одном потоке, ситуация повторилась :( Значит дело не в потоках...

Стартую новую страничку:
Код
C++ (Qt)
void QOutputDev::startPage (int pageNum, GfxState *state)
{         m_pageNum=pageNum;
        m_image = new QImage((int)state-> getPageWidth( ),(int)state-> getPageHeight( ),QImage::Format_ARGB32);
        m_painter = new QPainter (m_image );
       m_painter->setBrush(QBrush(Qt::white));
       QPainterPath path;
       //path.addRoundedRect(0,0,m_image->width(),m_image->height(),20,20);
       path.addRect(0,0,m_image->width(),m_image->height());
       m_painter->drawPath(path);
}
 

Конец странички:

Код
C++ (Qt)
void QOutputDev::endPage()
{
       paint();
       m_painter->end();
       delete m_image;
       delete m_painter;
}

проблема в m_painter-> drawText (QPointF(x1,y1), str ); , если закоментировать, то с памятью все нормально!

Что тут не так?


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: Ubuntu_linux от Ноябрь 04, 2011, 20:17
может те QtConcurrent лучше заюзать, кстати говоря.

Код
C++ (Qt)
#include <QtGui/QApplication>
#include <QFuture>
#include <QtConcurrentRun>
 
void hello()
{
   qDebug() << "Hello from thread " << QThread::currentThread();
}
 
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
 
   QFuture<void> future = QtConcurrent::run(hello);
   qDebug() << "hello from GUI thread " << QThread::currentThread();
   future.waitForFinished();
   return 0;  
}

в hello() реализуешь
Цитировать
запускаю процес отрисовки QPainter-ом на QImage текст + картинки
и не надо еб с потоками  :D

Так а в чем фишка?


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: SASA от Ноябрь 05, 2011, 11:53
если бы эт был форум задротов грамотности, тогда бы это было уместно. а так лицемерие, ИМХО. а от лицемеров с их "принципами" блювать хочется  :D
Вы бы на личности не переходили бы. Звучит как оскорбление. Это неприятно и  неуместно.

P.S.Извините за оффтоп. Он первый начал.  :'(


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: thechicho от Ноябрь 06, 2011, 11:09
// Вы бы на личности не переходили бы. Звучит как оскорбление. Это неприятно и  неуместно.
а то что ты написал, приятно ТС читать? хотя ТС какой-то странный и походу, что ему глубоко пофик на твое мнение, но все же, оно неуместно!
и я лично про тебя ничего не говорил, а написал в общем, что не люблю лицемеров.

// P.S.Извините за оффтоп. Он первый начал.
детский сад :D


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: Igors от Ноябрь 06, 2011, 11:36
проблема в m_painter-> drawText (QPointF(x1,y1), str ); , если закоментировать, то с памятью все нормально!

Что тут не так?
Ну в приведенном Вами фрагменте drawText вообще не просматривается  :) На всякий случай я бы поменял местами delete m_image/m_painter (чтобы было типа push/pop). Также обнулил бы эти указатели после удаления. Шансов что это поможет очень мало, но почиститься никогда не мешает.

Дальше стал бы  выкидывать из paint куски и смотреть - ну Вы так и делаете.


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: Ubuntu_linux от Ноябрь 06, 2011, 20:14
проблема в m_painter-> drawText (QPointF(x1,y1), str ); , если закоментировать, то с памятью все нормально!

Что тут не так?
Ну в приведенном Вами фрагменте drawText вообще не просматривается  :) На всякий случай я бы поменял местами delete m_image/m_painter (чтобы было типа push/pop). Также обнулил бы эти указатели после удаления. Шансов что это поможет очень мало, но почиститься никогда не мешает.

Дальше стал бы  выкидывать из paint куски и смотреть - ну Вы так и делаете.
попробую...
Но в принципе там же стоит m_paiter->end()  перед удалением.


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: SASA от Ноябрь 06, 2011, 22:52
// Вы бы на личности не переходили бы. Звучит как оскорбление. Это неприятно и  неуместно.
а то что ты написал, приятно ТС читать? хотя ТС какой-то странный и походу, что ему глубоко пофик на твое мнение, но все же, оно неуместно!
и я лично про тебя ничего не говорил, а написал в общем, что не люблю лицемеров.
Я сделал замечание по поводу формы. Я читаю этот форум и хочу, чтоб люди старались писать грамотно. А Вы сказали, что так делают только лицемеры. Это оскорбление.

P.S. Если  бы мне сделали такое замечание, я бы исправил свое сообщение.


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: andrew.k от Ноябрь 07, 2011, 00:21
чечино, у тебя что аватар, что большинство твоих сообщений на грани фола.
ты сейчас не прав, но продолжаешь что-то писать не по делу.
себя так не ведут. ты портишь этим форум.

хотелось бы узнать, помог ли совет igors


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: Ubuntu_linux от Ноябрь 07, 2011, 03:00
...
хотелось бы узнать, помог ли совет igors

НЕ ПОМОГЛО!

на 70 страничек ~ 45MБ памяти, пипец.
но если закоментировать m_painter-> drawText (QPointF(x1,y1), str ); и вместо текста рисовать прямоугольники то все в порядке ~13МБ  памяти. ( с самой пргой)
Что за херня?


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: thechicho от Ноябрь 07, 2011, 11:11
// Я читаю этот форум и хочу, чтоб люди старались писать грамотно
ну я ж грю лицемер.

andrew.k
на свою посмотри  :D
а так это оффтоп. иногда забавно его почитать.
особенно, когда SASA извеняется, а потом оффтопит. просто перлы выдает ;D
ТС все равно код зажал и хочет, чтобы ему телепаты из пальца высосали решение :D
так что это вся тема, сплошной оффтоп, поэтому я не считаю себя неправым или виноватым.
но оффтопить больше не буду :D


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: Bepec от Ноябрь 14, 2011, 08:51
Ubuntu_linux - хватит пложить печаль и багопроизводство - с тебя твой проект, или урезанная его версия, создающая/отрисовывающая/рисующая текст. И мы тогда уж 100% разберем.

А так - Кабы если бы кабы, да в лесу да по грибы, да по маленькой опушке шли неведомы зверушки, а в дебагерах ошибки, добавляются так шибко, а при запуске экран, синий весь парам там там.


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: Ubuntu_linux от Ноябрь 15, 2011, 13:56
скоро


Название: Re: Обязательно ли удалять поток чтоб освободить память?
Отправлено: Bepec от Ноябрь 15, 2011, 14:27
Молодец что читаешь на иностранных языках. Хорошая книга - желание помочь отпало враз.