Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: deMax от Сентябрь 19, 2013, 15:14



Название: Прервать выполнение QtConcurrent::run
Отправлено: deMax от Сентябрь 19, 2013, 15:14
Собственно загружаю в отдельном потоке изображение, QImage::load. Изображение большое и грузится не быстро. Как мне остановить поток и прервать загрузку?


Название: Re: Прервать выполнение QtConcurrent::run
Отправлено: mutineer от Сентябрь 19, 2013, 15:17
Цитировать
Note that the QFuture returned by QtConcurrent::run() does not support canceling, pausing, or progress reporting.


Название: Re: Прервать выполнение QtConcurrent::run
Отправлено: deMax от Сентябрь 19, 2013, 15:23
Цитировать
Note that the QFuture returned by QtConcurrent::run() does not support canceling, pausing, or progress reporting.
Это я увидел в хелпе. как создать поток, вызвать в нем QImage::load(bigfile) и прервать его выполнение?


Название: Re: Прервать выполнение QtConcurrent::run
Отправлено: mutineer от Сентябрь 19, 2013, 15:31
Например при помощи QThread


Название: Re: Прервать выполнение QtConcurrent::run
Отправлено: Igors от Сентябрь 19, 2013, 15:51
вызвать в нем QImage::load(bigfile) и прервать его выполнение?
Банальный ответ: никак, а если хочется - пусть перехочется. Стрелять нитку и сидеть с ошметками недогруженного имеджа себе дороже


Название: Re: Прервать выполнение QtConcurrent::run
Отправлено: deMax от Сентябрь 21, 2013, 12:55
вызвать в нем QImage::load(bigfile) и прервать его выполнение?
Банальный ответ: никак, а если хочется - пусть перехочется. Стрелять нитку и сидеть с ошметками недогруженного имеджа себе дороже
Спасибо. Моя проблема была в лишнем delete(я удалял, то что удаляли другие) перестарался немножко.

Теперь вопрос по потокам: есть данные settings, пользователь может на них влиять нажимая кнопочки, отрисовка происходит по таймеру и использует данные из settings только для чтения: void on_timer() {foreach(Layer *l, layers)l->paint;} потоков не создаю(функций createthread....нет), processEvent в l->paint тоже нет. Могут ли в процессе выполнения функции on_timer изменияться данные settings?


Название: Re: Прервать выполнение QtConcurrent::run
Отправлено: Igors от Сентябрь 21, 2013, 13:17
Теперь вопрос по потокам: есть данные settings, пользователь может на них влиять нажимая кнопочки, отрисовка происходит по таймеру и использует данные из settings только для чтения: void on_timer() {foreach(Layer *l, layers)l->paint;} потоков не создаю(функций createthread....нет), processEvent в l->paint тоже нет. Могут ли в процессе выполнения функции on_timer изменияться данные settings?
Впечатление что в действительности вопрос "так почему же они измнились ?"  :) Не должны, т.к. все происходит синхронно - события UI не получат управления пока on_timer не завершится  (по крайней мере в той же нитке) 


Название: Re: Прервать выполнение QtConcurrent::run
Отправлено: deMax от Сентябрь 23, 2013, 10:27
Впечатление что в действительности вопрос "так почему же они измнились ?"
Да нет, вопрос паранойи. Если программа начнет рисовать, а используемые ей данные начнут параллельно изменяться или вызовется слот который перестроит список с указателями - что может привести к вылету.


Название: Re: Прервать выполнение QtConcurrent::run
Отправлено: Igors от Сентябрь 23, 2013, 10:47
Да нет, вопрос паранойи. Если программа начнет рисовать, а используемые ей данные начнут параллельно изменяться или вызовется слот который перестроит список с указателями - что может привести к вылету.
Чтобы сердце успокоилось - натыкайте assert'ов, напр
Код
C++ (Qt)
void PaintSomething( ... )
{
drawState = true;
...
drawState = false;
}
 
void DoSomething( ... )
{
assert(!drawState);
...
}


Название: Re: Прервать выполнение QtConcurrent::run
Отправлено: Авварон от Сентябрь 23, 2013, 19:43
Ох, знатоки собрались. Поищите в сорцах креатора файл runextensions.h