mirror of
https://github.com/simonbrunel/qtpromise.git
synced 2024-11-26 05:17:02 +08:00
18739bd8e0
Split the root README.md in multiple Markdown files (in the `docs/` folder) to make easier reading, editing and extending the documentation. An online version is also available on netlify (https://qtpromise.netlify.com). Building it requires Node.js installed, then: - npm install -g gitbook-cli - gitbook install ./ - gitbook build . dist/docs
67 lines
1.7 KiB
Markdown
67 lines
1.7 KiB
Markdown
## QtConcurrent
|
|
|
|
QtPromise integrates with [QtConcurrent](https://doc.qt.io/qt-5/qtconcurrent-index.html) to make easy chaining QFuture with QPromise.
|
|
|
|
## <a name="qtconcurrent-convert"></a> Convert
|
|
|
|
Converting `QFuture<T>` to `QPromise<T>` is done using the [`qPromise`](helpers/qpromise.md) helper:
|
|
|
|
```cpp
|
|
QFuture<int> future = QtConcurrent::run([]() {
|
|
// {...}
|
|
return 42;
|
|
});
|
|
|
|
QPromise<int> promise = qPromise(future);
|
|
```
|
|
|
|
or simply:
|
|
|
|
```cpp
|
|
auto promise = qPromise(QtConcurrent::run([]() {
|
|
// {...}
|
|
}));
|
|
```
|
|
|
|
## Chain
|
|
|
|
Returning a `QFuture<T>` in [`then`](qpromise/then.md) or [`fail`](qpromise/fail.md) automatically translate to `QPromise<T>`:
|
|
|
|
```cpp
|
|
QPromise<int> input = ...
|
|
auto output = input.then([](int res) {
|
|
return QtConcurrent::run([]() {
|
|
// {...}
|
|
return QString("42");
|
|
});
|
|
});
|
|
|
|
// output type: QPromise<QString>
|
|
output.then([](const QString& res) {
|
|
// {...}
|
|
});
|
|
```
|
|
|
|
The `output` promise is resolved when the `QFuture` is [finished](https://doc.qt.io/qt-5/qfuture.html#isFinished).
|
|
|
|
## Error
|
|
|
|
Exceptions thrown from a QtConcurrent thread reject the associated promise with the exception as the reason. Note that if you throw an exception that is not a subclass of `QException`, the promise with be rejected with [`QUnhandledException`](https://doc.qt.io/qt-5/qunhandledexception.html#details) (this restriction only applies to exceptions thrown from a QtConcurrent thread, [read more](https://doc.qt.io/qt-5/qexception.html#details)).
|
|
|
|
```cpp
|
|
QPromise<int> promise = ...
|
|
promise.then([](int res) {
|
|
return QtConcurrent::run([]() {
|
|
// {...}
|
|
|
|
if (!success) {
|
|
throw CustomException();
|
|
}
|
|
|
|
return QString("42");
|
|
});
|
|
}).fail(const CustomException& err) {
|
|
// {...}
|
|
});
|
|
```
|