Spec-Zone.ru › Qt 6.0

Пространство имен QtFuture

Содержит различные идентификаторы, используемые классом QFuture. Подробнее...

Заголовок: #include <QtFuture>
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)

Подробное описание

Документация по типам

[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().

Документация по функциям

template <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().

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.0/qtfuture.html

Spec-Zone.ru

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