цепочки отдать результат в гуи поток? Вот пример из статьи
auto future = QtConcurrent::run(download, url)
.then(createImage)
.then(processImage)
.then(show);
Допустим в методе show мы вставляем изображение в лейбл. Но вот show же выполняется в другом не гуи потоке.
Чтобы show выполнялся в гуи потоке, мне надо делать так?
auto future = QtConcurrent::run(download, url)
.then(createImage)
.then(processImage)
.then(QtFuture::Launch::Sync, show);
Если я не правильно мыслю, можете предложить свои варианты, как вы делаете у себя?
QFutureSynchronizer<QVector<int>> sync; // Enabling sync machine. auto arrayOneFuture = QtConcurrent::run(createArray, 65536).then(leaveMoreKMax).then(sortOverload); // First array async run. auto arrayTwoFuture = QtConcurrent::run(createArray, 65536).then(leaveAliquotK).then(sortOverload); // Second array async run. sync.addFuture(arrayOneFuture); // Adding first QFuture to syncer. sync.addFuture(arrayTwoFuture); // Adding second QFuture to syncer. sync.waitForFinished(); // Awaiting for async jobs finished. QVector<int> resultVector = arrayOneFuture.result() + arrayTwoFuture.result(); // Merging arrays. Вот мой пример кода для лабки в универ который был. Из future метод result() достает результат.
По доке читал что при вызове result и если результат не готов, то будет ожидание
А еще у него есть сигнал на который можно законнектиться. А, стоп, это FutureWatcher. Но сути не меняет, можно законнектиться на сигнал и выцепить результат.
На wather не обратил внимание, пойду его почитаю
Попробовал QFutureWatcher, с ним нормально работает, но как-то не удобно. Было бы классно, если было бы подобное ниже. Типа done выполняется в том потоке, в котором изначально был вызван run auto future = QtConcurrent::run(download, url) .then(createImage) .then(processImage) .done(show)
ну с вотчером лишь пару строк добавить. )
В QFuture::then() можно с функцией передать контекст объект. И функция выполниться в потоке этого объекта
О, с контекстом работает как надо, благодарю за подсказку
Обсуждают сегодня