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

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

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: Обязательно ли удалять поток чтоб освободить память?  (Прочитано 20884 раз)
Ubuntu_linux
Гость
« : Октябрь 28, 2011, 15:54 »

Просто запускаю/приостанавливаю поток но память увеличивается, надо удалять поток?
Записан
Странник
Гость
« Ответ #1 : Октябрь 28, 2011, 18:03 »

надо ли удалять объект, чтобы освободить память?
Записан
Ubuntu_linux
Гость
« Ответ #2 : Октябрь 28, 2011, 19:36 »

надо ли удалять объект, чтобы освободить память?
Тонкий намек? Подмигивающий
Записан
thechicho
Гость
« Ответ #3 : Октябрь 28, 2011, 21:04 »

красноглазик, выложи, плиз, код, как ты с потоком работаешь. старт, пауза, удаление.
Записан
Ubuntu_linux
Гость
« Ответ #4 : Октябрь 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 ?
« Последнее редактирование: Октябрь 29, 2011, 02:25 от Ubuntu_linux » Записан
Bepec
Гость
« Ответ #5 : Октябрь 31, 2011, 09:12 »

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

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

PS код пжалста предъявите, гражданин.
Записан
Akon
Гость
« Ответ #6 : Октябрь 31, 2011, 09:58 »

deep copy QImage?
Записан
andrew.k
Гость
« Ответ #7 : Октябрь 31, 2011, 13:49 »

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

При каждом последующем вызове потока соответственно будет утекать память.
Почему это?
Записан
Bepec
Гость
« Ответ #8 : Октябрь 31, 2011, 14:10 »

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

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

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

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

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

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

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

To andrew.k:
Память будет не теряться(ибо можно остановить эти циклы), но соответственно каждая новая копия требует снова и снова ресурсов/мощности. И получается так называемая утечка памяти. Возможно и контролируемая, но утечка.
« Последнее редактирование: Октябрь 31, 2011, 14:16 от Bepec » Записан
andrew.k
Гость
« Ответ #9 : Октябрь 31, 2011, 14:16 »

Ты ошибаешься. Если поток уже работает, то метод start() ничего не делает.
Смотри ассистент.
Записан
Bepec
Гость
« Ответ #10 : Октябрь 31, 2011, 14:26 »

Кхм. повторюсь тогда (просил поправить - поправили, спасибо Улыбающийся )

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

Почитал, действительно старт ничего не сделает, но тогда как ув.Ubuntu_linux стартует поток? Улыбающийся

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

PS ну код тут нужен, а спорить можно до посинения Улыбающийся
Записан
andrew.k
Гость
« Ответ #11 : Октябрь 31, 2011, 15:08 »

Ясно, что по отдельному экземпляру на отдельный поток. Иначе бы у него просто не было потоков.
Так же ясно, что удалять поток не нужно после завершения, а можно запустить повторно.
У него проблема в другом, это уже выяснено и обсуждается в другой теме.
Записан
Bepec
Гость
« Ответ #12 : Октябрь 31, 2011, 15:23 »

 И в той и в этой ни 1 куска кода Улыбающийся Он что тренирует интуицию у вас? Улыбающийся
Записан
Ubuntu_linux
Гость
« Ответ #13 : Октябрь 31, 2011, 19:21 »

Проблема решена!
Я не делал новый поток каждый раз, а просто стартовал поток, после того как он завершыт свое дело. А проблема оказалась в повторяющемся вызове старта до завершения, как я полагаю.
Код приведен пару постов выше...
Записан
andrew.k
Гость
« Ответ #14 : Октябрь 31, 2011, 19:38 »

В этом не могло быть проблемы.
О чем я писал выше.
Повторный вызов старт ничего не делает.

"If the thread is already running, this function does nothing."
QThread
Записан
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


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