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