Spec-Zone.ru › Qt

Класс QPromise

шаблон <typename T> класс QPromise

Класс QPromise предоставляет способ хранения результатов вычислений, к которым можно получить доступ с помощью QFuture. Подробнее...

Заголовок: #include <QPromise>
CMake: find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
С момента: Qt 6.0
  • Список всех членов, включая унаследованные

Примечание: Все функции в этом классе являются безопасными для многопоточного доступа.

Открытые функции

QPromise(QPromise<T> &&other)
QPromise()
QPromise<T> & operator=(QPromise<T> &&other)
~QPromise()
bool addResult(const T &result, int index = -1)
bool addResult(T &&result, int index = -1)
void finish()
QFuture<T> future() const
bool isCanceled() const
void setException(const QException &e)
void setException(std::exception_ptr e)
void setProgressRange(int minimum, int maximum)
void setProgressValue(int progressValue)
void setProgressValueAndText(int progressValue, const QString &progressText)
void start()
void suspendIfRequested()
void swap(QPromise<T> &other)

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

QPromise предоставляет простой способ передачи прогресса и результатов пользовательских вычислений в QFuture в асинхронном режиме. Для работы связи, QFuture должен быть создан QPromise.

Вы можете использовать рабочие нагрузки на основе QPromise в качестве альтернативы Qt Concurrent фреймворку, когда требуется точный контроль или достаточно высокоуровневого коммуникационного примитива, сопровождающего QFuture.

Простейшим случаем взаимодействия promise и future будет передача единственного результата:

    QPromise<int> promise;
    QFuture<int> future = promise.future();

    QScopedPointer<QThread> thread(QThread::create([] (QPromise<int> promise) {
        promise.start();   // notifies QFuture that the computation is started
        promise.addResult(42);
        promise.finish();  // notifies QFuture that the computation is finished
    }, std::move(promise)));
    thread->start();

    future.waitForFinished();  // blocks until QPromise::finish is called
    future.result();  // returns 42

По своему дизайну QPromise — это объект, который можно только перемещать. Это поведение помогает гарантировать, что при уничтожении promise связанный объект future уведомляется и не будет ждать вечно, пока результаты не станут доступны. Однако это неудобно, если нужно использовать одну и ту же promise для отчета о результатах из разных потоков. В настоящее время нет специального способа сделать это, но существуют известные механизмы, такие как использование умных указателей или сырых указателей/ссылок. QSharedPointer — хороший выбор по умолчанию, если вы хотите скопировать promise и использовать её в нескольких местах одновременно. Сырые указатели или ссылки, в некотором смысле, проще и, вероятно, работают быстрее (так как нет необходимости управлять ресурсами), но могут привести к висячим ссылкам.

Вот пример того, как promise можно использовать в нескольких потоках:

    QSharedPointer<QPromise<int>> sharedPromise(new QPromise<int>());
    QFuture<int> future = sharedPromise->future();

    // ...

    // here, QPromise is shared between threads via a smart pointer
    QScopedPointer<QThread> threads[] = {
        QScopedPointer<QThread>(QThread::create([] (auto sharedPromise) {
            sharedPromise->addResult(0, 0);  // adds value 0 by index 0
        }, sharedPromise)),
        QScopedPointer<QThread>(QThread::create([] (auto sharedPromise) {
            sharedPromise->addResult(-1, 1);  // adds value -1 by index 1
        }, sharedPromise)),
        QScopedPointer<QThread>(QThread::create([] (auto sharedPromise) {
            sharedPromise->addResult(-2, 2);  // adds value -2 by index 2
        }, sharedPromise)),
        // ...
    };
    // start all threads
    for (auto& t : threads)
        t->start();

    // ...

    future.resultAt(0);  // waits until result at index 0 becomes available. returns value  0
    future.resultAt(1);  // waits until result at index 1 becomes available. returns value -1
    future.resultAt(2);  // waits until result at index 2 becomes available. returns value -2

См. также QFuture.

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

bool QPromise::addResult(T &&result, int index = -1)

bool QPromise::addResult(const T &result, int index = -1)

Добавляет result в внутренний набор результатов в позиции index. Если index не указан, result добавляется в конец набора.

Возвращает true при добавлении result в набор.

Возвращает false когда данная promise находится в состоянии отмены или завершения или когда result отклоняется. addResult() отклоняет result, если в наборе уже есть другой результат, сохранённый в том же индексе.

Вы можете получить результат по определённому индексу, вызвав QFuture::resultAt().

Примечание: Можно указать произвольный индекс и запросить результат по этому индексу. Однако некоторые методы QFuture работают с непрерывными результатами. Например, итерационные подходы, использующие QFuture::resultCount() или QFuture::const_iterator. Чтобы получить все доступные результаты, не задумываясь о пробелах в индексах, используйте QFuture::results().

QPromise::QPromise(QPromise<T> &&other)

Перемещает конструктор нового QPromise из other.

См. также operator=().

QPromise::QPromise()

Создает QPromise в стандартном состоянии.

QPromise<T> &QPromise::operator=(QPromise<T> &&other)

Перемещает присваивание other в эту promise и возвращает ссылку на эту promise.

QPromise::~QPromise()

Уничтожает promise.

Примечание: Promise неявно переходит в состояние отмены при уничтожении, если finish() не был вызван пользователем.

void QPromise::finish()

Сообщает о завершении вычисления. После завершения новые результаты не будут добавляться при вызове addResult(). Этот метод сопровождает start().

См. также QFuture::isFinished(), QFuture::waitForFinished(), и start().

QFuture<T> QPromise::future() const

Возвращает future, связанную с этой promise.

bool QPromise::isCanceled() const

Возвращает, была ли отменена вычисление с помощью функции QFuture::cancel(). Возвращаемое значение true указывает, что вычисление должно быть завершено и finish() вызвано.

Примечание: После отмены доступ к имеющимся в данный момент результатам всё ещё может быть получен с помощью future, но новые результаты не будут добавляться при вызове addResult().

void QPromise::setException(const QException &e)

Устанавливает исключение e в качестве результата вычисления.

Примечание: Можно установить не более одного исключения в течение выполнения вычисления.

Примечание: Этот метод не должен использоваться после QFuture::cancel() или finish().

См. также isCanceled().

void QPromise::setException(std::exception_ptr e)

Это перегруженная функция.

void QPromise::setProgressRange(int minimum, int maximum)

Устанавливает диапазон прогресса вычисления от minimum до maximum.

Если maximum меньше minimum, minimum становится единственным допустимым значением.

Значение прогресса сбрасывается до minimum.

Использование диапазона прогресса можно отключить, используя setProgressRange(0, 0). В этом случае значение прогресса также сбрасывается до 0.

См. также QFuture::progressMinimum(), QFuture::progressMaximum() и QFuture::progressValue().

void QPromise::setProgressValue(int progressValue)

Устанавливает значение прогресса вычисления на progressValue. Возможен только инкремент значения прогресса. Это удобный метод для вызова setProgressValueAndText(progressValue, QString()).

В случае, если progressValue выходит за пределы диапазона прогресса, этот метод не оказывает никакого влияния.

См. также QFuture::progressValue() и setProgressRange().

void QPromise::setProgressValueAndText(int progressValue, const QString &progressText)

Устанавливает значение прогресса и текст прогресса вычисления соответственно на progressValue и progressText. Возможен только инкремент значения прогресса.

Примечание: Этот метод не оказывает никакого влияния, если обещание находится в отмененном или завершенном состоянии.

См. также QFuture::progressValue(), QFuture::progressText(), QFuture::cancel() и finish().

void QPromise::start()

Сообщает, что вычисление начато. Вызов этого метода важен для обозначения начала вычисления, так как методы QFuture полагаются на эту информацию.

Примечание: Необходимо уделить особое внимание, когда start() вызывается из нового потока. В таком случае вызов может быть естественным образом задержан из-за особенностей планирования потоков.

См. также QFuture::isStarted(), QFuture::waitForFinished() и finish().

void QPromise::suspendIfRequested()

Условно приостанавливает текущий поток выполнения и ожидает возобновления или отмены соответствующими методами QFuture. Этот метод не блокирует, если вычисление не запрошено на приостановку QFuture::suspend() или другим родственным методом. Если вы хотите проверить, было ли выполнение приостановлено, используйте QFuture::isSuspended().

Примечание: При использовании одного и того же обещания в нескольких потоках, QFuture::isSuspended() становится true как только хотя бы один поток с обещанием приостанавливается.

Следующие фрагменты кода демонстрируют использование механизма приостановки:

    // Create promise and future
    QPromise<int> promise;
    QFuture<int> future = promise.future();

    promise.start();
    // Start a computation thread that supports suspension and cancellation
    QScopedPointer<QThread> thread(QThread::create([] (QPromise<int> promise) {
        for (int i = 0; i < 100; ++i) {
            promise.addResult(i);
            promise.suspendIfRequested();   // support suspension
            if (promise.isCanceled())       // support cancellation
                break;
        }
        promise.finish();
    }, std::move(promise)));
    thread->start();

QFuture::suspend() запрашивает ассоциированное обещание приостановиться:

    future.suspend();

После того, как QFuture::isSuspended() становится true, вы можете получить промежуточные результаты:

    future.resultCount();  // returns some number between 0 and 100
    for (int i = 0; i < future.resultCount(); ++i) {
        // process results available before suspension
    }

При приостановке вы можете возобновить или отменить ожидающее вычисление:

    future.resume();  // resumes computation, this call will unblock the promise
    // alternatively, call future.cancel() to stop the computation

    future.waitForFinished();
    future.results();  // returns all computation results - array of values from 0 to 99

См. также QFuture::resume(), QFuture::cancel(), QFuture::setSuspended() и QFuture::toggleSuspended().

void QPromise::swap(QPromise<T> &other)

Меняет местами обещание other с этим обещанием. Эта операция очень быстрая и никогда не терпит неудач.

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

Spec-Zone.ru

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