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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Прервать выполнение QtConcurrent::run  (Прочитано 6002 раз)
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« : Сентябрь 19, 2013, 15:14 »

Собственно загружаю в отдельном потоке изображение, QImage::load. Изображение большое и грузится не быстро. Как мне остановить поток и прервать загрузку?
Записан
mutineer
Гость
« Ответ #1 : Сентябрь 19, 2013, 15:17 »

Цитировать
Note that the QFuture returned by QtConcurrent::run() does not support canceling, pausing, or progress reporting.
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #2 : Сентябрь 19, 2013, 15:23 »

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

Например при помощи QThread
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Сентябрь 19, 2013, 15:51 »

вызвать в нем QImage::load(bigfile) и прервать его выполнение?
Банальный ответ: никак, а если хочется - пусть перехочется. Стрелять нитку и сидеть с ошметками недогруженного имеджа себе дороже
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #5 : Сентябрь 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?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Сентябрь 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 не завершится  (по крайней мере в той же нитке) 
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #7 : Сентябрь 23, 2013, 10:27 »

Впечатление что в действительности вопрос "так почему же они измнились ?"
Да нет, вопрос паранойи. Если программа начнет рисовать, а используемые ей данные начнут параллельно изменяться или вызовется слот который перестроит список с указателями - что может привести к вылету.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Сентябрь 23, 2013, 10:47 »

Да нет, вопрос паранойи. Если программа начнет рисовать, а используемые ей данные начнут параллельно изменяться или вызовется слот который перестроит список с указателями - что может привести к вылету.
Чтобы сердце успокоилось - натыкайте assert'ов, напр
Код
C++ (Qt)
void PaintSomething( ... )
{
drawState = true;
...
drawState = false;
}
 
void DoSomething( ... )
{
assert(!drawState);
...
}
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #9 : Сентябрь 23, 2013, 19:43 »

Ох, знатоки собрались. Поищите в сорцах креатора файл runextensions.h
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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