37void examples(QFuture<QString> someQStringFuture,
38 QFuture<
int> someIntFuture,
39 QFuture<
void> someVoidFuture,
45 QFuture<QString> future = someQStringFuture;
47 QFuture<QString>::const_iterator i;
48 for (i = future.constBegin(); i != future.constEnd(); ++i)
49 cout << qPrintable(*i) << endl;
55 QFuture<QString> future;
57 QFutureIterator<QString> i(future);
64 QFuture<QString> future;
66 QFutureIterator<QString> i(future);
68 while (i.hasPrevious())
69 QString s = i.previous();
75 using NetworkReply = std::variant<QByteArray, QNetworkReply::NetworkError>;
77 enum class IOError { FailedToRead, FailedToWrite };
78 using IOResult = std::variant<QString, IOError>;
82 QFuture<IOResult> future = QtConcurrent::run([url] {
84 return NetworkReply(QNetworkReply::TimeoutError);
85 }).then([](NetworkReply reply) {
86 if (
auto error = std::get_if<QNetworkReply::NetworkError>(&reply))
87 return IOResult(IOError::FailedToRead);
89 auto data = std::get_if<QByteArray>(&reply);
94 auto result = future.result();
95 if (
auto filePath = std::get_if<QString>(&result)) {
107 QFuture<
int> future = someIntFuture;
108 future.then([](QFuture<
int> f) {
111 auto result = f.result();
113 }
catch (QException &e) {
122 QFuture<
int> future = someIntFuture;
123 auto continuation = future.then([](
int res1){
return res1; }).then([](
int res2){
return res2; });
127 auto result = continuation.result();
128 }
catch (QException &e) {
136 QFuture<
int> future = someIntFuture;
137 auto resultFuture = future.then([](
int res) {
142 }).onFailed([](
const Error &e) {
152 auto result = resultFuture.result();
158 QFuture<
int> future = someIntFuture;
159 future.then([](
int res) {
161 throw std::runtime_error(
"message");
163 }).onFailed([](
const std::exception &e) {
166 }).onFailed([](
const std::runtime_error &e) {
175 QFuture<
int> future = someIntFuture;
176 auto resultFuture = future.then([](
int res) {
178 throw Error(
"message");
181 }).onFailed([](
const std::exception &e) {
184 }).onFailed([](
const QException &e) {
190 auto result = resultFuture.result();
191 }
catch(QException &someException) {
200 QFuture<
void> voidFuture = QtFuture::connect(&object, &Object::noArgSignal);
201 QFuture<
int> intFuture = QtFuture::connect(&object, &Object::singleArgSignal);
203 using Args = std::tuple<
int,
double, QString>;
204 QFuture<Args> tupleFuture = QtFuture::connect(&object, &Object::multipleArgs);
211 QtFuture::connect(&object, &Object::singleArgSignal).then([](
int value) {
220 QtFuture::connect(&object, &Object::singleArgSignal).then(QtFuture::Launch::Async, [](
int value) {
229 QtFuture::connect(&object, &Object::singleArgSignal).then([](
int value) {
231 throw std::exception();
233 }).onFailed([](
const std::exception &e) {
243 QFuture<
int> testFuture = someIntFuture;
244 auto resultFuture = testFuture.then([](
int res) {
262 QFuture<
int> testFuture = someIntFuture;
263 auto resultFuture = testFuture.then([](
int res) {
279 bool cachedResultsReady;
283 auto future = cachedResultsReady ? QtFuture::makeReadyVoidFuture()
284 : QtConcurrent::run([] { });
285 auto continuation = future.then(context, [] {
295 QFuture<
int> testFuture ;
296 auto resultFuture = testFuture.then([](
int res) {
300 }).then([](
int res) {
314 QList<QFuture<
int>> inputFutures {};
317 auto whenAll = QtFuture::whenAll(inputFutures.begin(), inputFutures.end());
321 QtFuture::whenAll<std::vector<QFuture<
int>>>(inputFutures.begin(), inputFutures.end());
327 QList<QFuture<
int>> inputFutures {};
329 QtFuture::whenAll(inputFutures.begin(), inputFutures.end())
330 .then([](
const QList<QFuture<
int>> &results) {
331 for (
auto future : results) {
332 if (future.isCanceled())
347 QFuture<
int> intFuture ;
348 QFuture<QString> stringFuture ;
349 QFuture<
void> voidFuture ;
351 using FuturesVariant = std::variant<QFuture<
int>, QFuture<QString>, QFuture<
void>>;
354 auto whenAll = QtFuture::whenAll(intFuture, stringFuture, voidFuture);
358 QtFuture::whenAll<std::vector<FuturesVariant>>(intFuture, stringFuture, voidFuture);
364 QFuture<
int> intFuture ;
365 QFuture<QString> stringFuture ;
366 QFuture<
void> voidFuture ;
368 using FuturesVariant = std::variant<QFuture<
int>, QFuture<QString>, QFuture<
void>>;
370 QtFuture::whenAll(intFuture, stringFuture, voidFuture)
371 .then([](
const QList<FuturesVariant> &results) {
373 for (
auto result : results)
376 std::visit([](
auto &&future) { handleResult(future); }, result);
385 QList<QFuture<
int>> inputFutures ;
387 QtFuture::whenAny(inputFutures.begin(), inputFutures.end())
388 .then([](
const QtFuture::WhenAnyResult<
int> &result) {
389 qsizetype index = result.index;
390 QFuture<
int> future = result.future;
398 QFuture<
int> intFuture ;
399 QFuture<QString> stringFuture ;
400 QFuture<
void> voidFuture ;
402 using FuturesVariant = std::variant<QFuture<
int>, QFuture<QString>, QFuture<
void>>;
404 QtFuture::whenAny(intFuture, stringFuture, voidFuture).then([](
const FuturesVariant &result) {
407 std::visit([](
auto &&future) { handleResult(future); }, result);
415 QFuture<QFuture<
int>> outerFuture ;
416 QFuture<
int> unwrappedFuture = outerFuture.unwrap();
421 auto scale = [](
const QImage &img) {
return img.scaled(100, 100); };
422 auto reduceImages = [](QImage &result,
const QImage &img) {
return result; };
425 auto downloadImages = [] (
const QUrl &url) {
426 QList<QImage> images;
431 auto processImages = [scale, reduceImages](
const QList<QImage> &images) {
432 return QtConcurrent::mappedReduced(images, scale, reduceImages);
435 auto show = [](
const QImage &image) { };
437 auto future = QtConcurrent::run(downloadImages, url)
446 QFuture<QFuture<QFuture<
int>>> outerFuture;
447 QFuture<
int> unwrappedFuture = outerFuture.unwrap();
455 QFuture<
int> f1 = p.future();
456 f1.then([](
int) { qDebug(
"first"); });
458 QFuture<
int> f2 = p.future();
459 f2.then([](
int) { qDebug(
"second"); });
469 const std::vector<
int> values{1, 2, 3};
470 auto f = QtFuture::makeReadyRangeFuture(values);
476 auto f = QtFuture::makeReadyRangeFuture({1, 2, 3});
481 auto f = QtFuture::makeReadyRangeFuture({1, 2, 3});
483 const int count = f.resultCount();
484 const auto results = f.results();
490 auto f = QtFuture::makeReadyValueFuture(std::make_unique<
int>(42));
492 const int result = *f.takeResult();
498 auto f = QtFuture::makeReadyVoidFuture();
500 const bool started = f.isStarted();
501 const bool running = f.isRunning();
502 const bool finished = f.isFinished();
509 QFuture<Result> future ;
510 auto continuation = future.then(context, [context](
Result result) {
512 }).onCanceled([context = QPointer(context)] {
523 auto f = QtConcurrent::run([] {})