Название: удаление стека потока Отправлено: define от Июль 20, 2011, 17:27 имеется поток:
Код: /* QImage* image;*/ Вызов этого потока: Код: /*ShowImage *showimage_storage;*/ Проблема в следующем: в Код: image=new QImage(tmp.getPath());//tmp.getPath() - путь к изображению Итак вопрос: как насильно можно отчистить стек в потоке? Название: Re: удаление стека потока Отправлено: Пантер от Июль 20, 2011, 18:02 connect (showimage_storage, SIGNAL (terminated ()), showimage_storage, SLOT (deleteLater ()));
и в деструкторе ShowImage удаляешь картинку. Название: Re: удаление стека потока Отправлено: Igors от Июль 20, 2011, 18:37 Проблема в следующем: Наверное Вы хотели сказать 300мб+ (30 то так, кот наплакал). Вы делаете то что не то чтобы "нельзя" а "не нужно" делать - просто потому что себе дороже. Насильное завершение нитки - хороший способ нажить себе кучу забот и потом их долго разгребать. Чего Вы хотите от нитки? Чтобы она в фоне грузила имедж и (если нужно) его скалила. Ну и сделайте напр такв Код: image=new QImage(tmp.getPath());//tmp.getPath() - путь к изображению Итак вопрос: как насильно можно отчистить стек в потоке? Код И вся любовь с той ниткой. А сами спокойно поджидаете на слоте когда она отстреляется (сигнал finished), забираете готовый имедж, куда надо его в UI ставите и удаляете объект MyImageLoader. Чистить ничего не требуется. Понятно что хочется прервать загрузку имеджа в любой момент - но ничего, перехочется Название: Re: удаление стека потока Отправлено: define от Июль 20, 2011, 19:08 К сожалению задача стоит вполне конкретная :(
Код: В конструкторе: Сам метод: Код: ShowImage::~ShowImage() Название: Re: удаление стека потока Отправлено: LisandreL от Июль 20, 2011, 19:40 image->~QImage(); Это что за изобретение?delete image; Но тут всё намного хуже. terminate - это аварийное завершение потока и может его прервать где угодно, соответственно и память может утекать где угодно. Для штатного завершения потока его использовать не следует. Название: Re: удаление стека потока Отправлено: zenden от Июль 21, 2011, 10:36 А причем тут вообще стек?
У вас картинка ведь в куче выделяется. Если вам уж так хочется использовать ужасный метод terminate(), то сохраняйте где-то предварительно указатель на вашу картинку и удаляйте её в главном потоке. Название: Re: удаление стека потока Отправлено: Igors от Июль 21, 2011, 13:50 Но тут всё намного хуже. terminate - это аварийное завершение потока и может его прервать где угодно, соответственно и память может утекать где угодно. То было бы еще ничего если только "утечки". Но после насильного прерывания QImage может вообще остаться уродом который рухнет на delete.К сожалению задача стоит вполне конкретная :( Ну то дело Ваше (и Вашего проекта) какие задачи ставить. По ходу дела еще 2 детали 1) Работа с UI не из главной нитки Код: void ShowImage::run() 2) Между загрузкой имеджа и его масштабированием легко провериться на отмену (флажок) и 100% корректно выйти. Масштабирование также может быть сделано по частям с выводом кусков - здесь проблем нет. Название: Re: удаление стека потока Отправлено: define от Июль 21, 2011, 14:40 Между загрузкой имеджа и его масштабированием легко провериться на отмену (флажок) и 100% корректно выйти. Именно так и сделал. Спасибо всем. |