Spec-Zone.ru › Qt 6.1

Пространство имён 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API