Пространство имён QtFuture
Содержит различные идентификаторы, используемые классом QFuture. Подробнее...
| Заголовок: | #include <QFuture> |
| CMake: | find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
Типы
| Перечисление | Launch { Sync, Async, Inherit } |
Функции
| QFuture<ArgsType<Signal> > | connect(Sender *sender, Signal signal) |
| QFuture<T> | makeExceptionalFuture(const QException &exception) |
| QFuture<T> | makeExceptionalFuture(std::exception_ptr exception) |
| QFuture<std::decay_t<T> > | makeReadyFuture(T &&value) |
| QFuture<void> | makeReadyFuture() |
| QFuture<T> | makeReadyFuture(const QList<T> &values) |
Подробное описание
Документация по типам
[since 6.0] перечисление QtFuture::Launch
Представляет политики выполнения продолжения QFuture.
| Константа | Значение | Описание |
|---|---|---|
QtFuture::Launch::Sync |
0 |
Продолжение будет запущено в том же потоке, в котором выполнялся родительский элемент, или в потоке, где находится родитель, если продолжение присоединено после завершения родительского элемента. |
QtFuture::Launch::Async |
1 |
Продолжение будет запущено в отдельном потоке, взятом из глобального QThreadPool. |
QtFuture::Launch::Inherit |
2 |
Продолжение будет унаследовать политику запуска родительского элемента или его пула потоков, если использовался пользовательский. |
Это перечисление было введено или изменено в Qt 6.0.
См. также QFuture::then() и QThreadPool::globalInstance().
Документация по функциям
шаблон <typename Sender, typename Signal, typename> QFuture<ArgsType<Signal> > QtFuture::connect(Sender *sender, Signal signal)
Создаёт и возвращает QFuture, который станет доступным, когда sender выведет signal. Если signal не принимает аргументов, возвращается QFuture<void>. Если signal принимает один аргумент, возвращаемое QFuture будет заполнено значением аргумента сигнала. Если signal принимает несколько аргументов, возвращаемое QFuture заполняется std::tuple, хранящим значения аргументов сигнала. Если sender уничтожен до вывода signal, возвращаемое QFuture будет отменено.
Например, давайте представим объект:
class Object : public QObject
{
Q_OBJECT
...
signals:
void noArgSignal();
void singleArgSignal(int value);
void multipleArgs(int value1, double value2, const QString &value3);
}; Мы можем подключить его сигналы к объектам QFuture следующим образом:
Object object; QFuture<void> voidFuture = QtFuture::connect(&object, &Object::noArgSignal); QFuture<int> intFuture = QtFuture::connect(&object, &Object::singleArgSignal); using Args = std::tuple<int, double, QString>; QFuture<Args> tupleFuture = QtFuture::connect(&object, &Object::multipleArgs)
Мы также можем связать продолжения, которые будут выполняться при выводе сигнала:
QtFuture::connect(&object, &Object::singleArgSignal).then([](int value) {
// do something with the value
}); Вы также можете запустить продолжение в новом потоке или в пользовательском пуле потоков, используя политики QtFuture::Launch. Например:
QtFuture::connect(&object, &Object::singleArgSignal).then(QtFuture::Launch::Async, [](int value) {
// this will run in a new thread
}); Выбрасывание исключения из слота, вызванного соединением сигналов-слотов Qt, считается неопределённым поведением, если оно не обрабатывается в слоте. Но с QFuture::connect() вы можете выбрасывать и обрабатывать исключения из продолжений:
QtFuture::connect(&object, &Object::singleArgSignal).then([](int value) {
...
throw std::exception();
...
}).onFailed([](const std::exception &e) {
// handle the exception
}).onFailed([] {
// handle other exceptions
}); Примечание: Подключенное будущее будет выполнено только один раз, когда сигнал выводится в первый раз.
См. также QFuture и QFuture::then().
[since 6.1] шаблон <typename T> QFuture<T> QtFuture::makeExceptionalFuture(const QException &exception)
Создаёт и возвращает QFuture, который уже имеет исключение exception.
QException e;
auto f = QtFuture::makeExceptionalFuture<int>(e);
...
try {
f.result(); // throws QException
} catch (QException &) {
// handle exception here
} Эта функция была введена в Qt 6.1.
См. также QFuture, QException и QtFuture::makeReadyFuture().
[since 6.1] шаблон <typename T> QFuture<T> QtFuture::makeExceptionalFuture(std::exception_ptr exception)
Это перегруженная функция.
Создаёт и возвращает QFuture, который уже имеет исключение exception.
struct TestException
{
};
...
auto exception = std::make_exception_ptr(TestException());
auto f = QtFuture::makeExceptionalFuture<int>(exception);
...
try {
f.result(); // throws TestException
} catch (TestException &) {
// handle exception here
} Эта функция была введена в Qt 6.1.
См. также QFuture, QException и QtFuture::makeReadyFuture().
[since 6.1] шаблон <typename T, typename> QFuture<std::decay_t<T> > QtFuture::makeReadyFuture(T &&value)
Это перегруженная функция.
Создаёт и возвращает QFuture, который уже имеет результат value. Возвращаемое QFuture имеет тип std::decay_t<T>, где T не void.
auto f = QtFuture::makeReadyFuture(std::make_unique<int>(42)); ... const int result = *f.takeResult(); // result == 42
Эта функция была введена в Qt 6.1.
См. также QFuture и QtFuture::makeExceptionalFuture().
[since 6.1] QFuture<void> QtFuture::makeReadyFuture()
Это перегруженная функция.
Создаёт и возвращает QFuture типа void. Такое QFuture не может хранить никакого результата. Можно использовать его для запроса состояния вычисления. Возвращаемое QFuture всегда будет в завершённом состоянии.
auto f = QtFuture::makeReadyFuture(); ... const bool started = f.isStarted(); // started == true const bool running = f.isRunning(); // running == false const bool finished = f.isFinished(); // finished == true
Эта функция была введена в Qt 6.1.
См. также QFuture, QFuture::isStarted(), QFuture::isRunning(), QFuture::isFinished() и QtFuture::makeExceptionalFuture().
[since 6.1] шаблон <typename T> QFuture<T> QtFuture::makeReadyFuture(const QList<T> &values)
Это перегруженная функция.
Создаёт и возвращает QFuture, который уже имеет несколько результатов, установленных из values.
const QList<int> values { 1, 2, 3 };
auto f = QtFuture::makeReadyFuture(values);
...
const int count = f.resultCount(); // count == 3
const auto results = f.results(); // results == { 1, 2, 3 } Эта функция была введена в Qt 6.1.
См. также QFuture и QtFuture::makeExceptionalFuture().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/qtfuture.html