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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: QtConcurrent::run с прогрессом выполнения  (Прочитано 30391 раз)
AlekseyK
Гость
« Ответ #15 : Июнь 03, 2015, 17:07 »

ДААААА?Непонимающий Улыбающийся))))))))))))) Сейчас попробуем ещё тогда. Улыбающийся Спасибо! Вот на это-то времени и не хватило разобраться.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #16 : Июнь 03, 2015, 17:15 »

Ну как бэ
Код:
template <typename Class, typename T>
QFuture<T> run(void (Class::*fn)(QFutureInterface<T> &), Class *object);
Записан
AlekseyK
Гость
« Ответ #17 : Июнь 03, 2015, 17:24 »

Ну да, но на примерах оно лучше Улыбающийся
Записан
AlekseyK
Гость
« Ответ #18 : Июнь 03, 2015, 18:27 »

Собралось, спасибо! Попробуем переключить сигналы.
Записан
AlekseyK
Гость
« Ответ #19 : Июнь 03, 2015, 18:50 »

Ура! Всё заработало, можно отмечать тему как решённую!
Записан
AlekseyK
Гость
« Ответ #20 : Июнь 12, 2015, 19:34 »

Правда ещё одна проблема всплыла, не всё так красиво получилось как хотелось: сигналы из процесса не все доходят до диалога, останавливаются где-то на 60-95% почему-то: значение и текст. Пришлось опять привязать сигналы напрямую: Процесс -> ProgressDialog. Что за ерунда, почему так происходит? Если привязываем процесс -> вызов QFutureInterface::setProgressValueAndText(progressValue, message) -> ProgressDialog, то  сигналы теряются в конце.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #21 : Июнь 12, 2015, 20:38 »

Хз, не замечал. Установка значения происходит? как обрабатываете finished? репортите ли завершение?
Записан
AlekseyK
Гость
« Ответ #22 : Июнь 12, 2015, 21:45 »

Хз, не замечал. Установка значения происходит?
Конечно, процесс заканчивается так:
Код
C++ (Qt)
futureInterface.setProgressValueAndText(100, "C-CDA document export finished!");

как обрабатываете finished?
Код
C++ (Qt)
void BackgroundWorkDialog::setFuture(const QFuture<void> &future)
{
 myProcessWatcher.setFuture(future);
 
 // Connect signals
 connect(&myProcessWatcher, SIGNAL(progressValueChanged(int)),
         progressBar, SLOT(setValue(int)));
 connect(&myProcessWatcher, SIGNAL(progressTextChanged(QString)),
         label, SLOT(setText(QString)));
 connect(&myProcessWatcher, SIGNAL(finished()), this, SLOT(proccessFinish()));
}
 
void BackgroundWorkDialog::proccessFinish()
{
 // disconnect dialog hiding
 disconnect(button, SIGNAL(clicked()), this, SLOT(hide()));
 
 if(isHidden())
   show();
 
 button->setText("Done!");
 connect(button, SIGNAL(clicked()), this, SLOT(accept()));
 connect(this, SIGNAL(accepted()), this, SLOT(deleteLater()));
 connect(this, SIGNAL(rejected()), this, SLOT(deleteLater()));
 
 emit finished();
}

репортите ли завершение?
Вызывается точно, т.к. кнопка ВСЕГДА меняет текст на "Done!", значит future или futureWatcher вызывает finished().
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #23 : Июнь 12, 2015, 22:56 »

Футуру лучше ставить после коннектов. Можете схематичный код таски привести?
Записан
AlekseyK
Гость
« Ответ #24 : Июнь 12, 2015, 23:09 »

Футуру лучше ставить после коннектов.

Можете схематичный код таски привести?
Конечно. XML экспорт, где после каждой секции выводится:
Код
C++ (Qt)
 
 reportProgress(10, "Generating ... section...");
 ...
 reportProgress(100, "Document export finished!");

Код
C++ (Qt)
void XMLReport::reportProgress(int progressValue, const QString &message)
{
 future().setProgressValueAndText(progressValue, message);
 
 emit progressValueChanged(progressValue);
 if(!message.isEmpty())
   emit progressTextChanged(message);
}
 

future() возвращает QFutureInterface, который передаётся при запуске процесса.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #25 : Июнь 13, 2015, 06:27 »

Боже, как это все запутано, навязывается какая-то футура, с которой надо мучительно разбираться... Не лучше ли по-простому: завести атомарный счетчик и делать ему ++ в каждом расчете. А главная нитка следит за ним по таймеру и обновляет индикатор. Так по крайней мере нет расходов на сигналы (а то часто работает на индикатор а не на расчет).
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #26 : Июнь 13, 2015, 10:07 »

Не лучше ли по-простому: на ассемблере?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #27 : Июнь 13, 2015, 10:54 »

Боже, как это все запутано, навязывается какая-то футура, с которой надо мучительно разбираться... Не лучше ли по-простому: завести атомарный счетчик и делать ему ++ в каждом расчете. А главная нитка следит за ним по таймеру и обновляет индикатор. Так по крайней мере нет расходов на сигналы (а то часто работает на индикатор а не на расчет).
К сожалению, задач может быть больше одной, соответственно и индикаторов понадобиться больше одного, значит и атомарный счетчик понадобиться не один.
В общем, получится еще запутанней, чем здесь. Улыбающийся
Хотя я ничего запутанного в future не наблюдаю.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #28 : Июнь 13, 2015, 11:47 »

Кстати о птичках: а что произойдет если задача выбросит исключение?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #29 : Июнь 13, 2015, 15:18 »

Кстати о птичках: а что произойдет если задача выбросит исключение?

Вы так кичитесь тем, что не читаете букварь, что регулярно ставите себя в дурацкое положение. Не позорьтесь, почитайте. Гугл std::future, std::promise.
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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