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

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

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: Обязательно ли удалять поток чтоб освободить память?  (Прочитано 21658 раз)
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.033 секунд. Запросов: 17.