Auf dieser Seite

QPromise Class

template <typename T> class QPromise

Die Klasse „QPromise“ bietet eine Möglichkeit, Berechnungsergebnisse zu speichern, auf die von „ QFuture “ zugegriffen werden kann. Mehr...

Header: #include <QPromise>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Seit: Qt 6.0

Hinweis: Alle Funktionen dieser Klasse sind threadsicher.

Öffentliche Funktionen

QPromise()
QPromise(const QPromise<T> &)
QPromise(QPromise<T> &&other)
~QPromise()
bool addResult(T &&result, int index = -1)
bool addResult(const T &result, int index = -1)
(since 6.6) bool addResults(const QList<T> &results)
(since 6.6) bool emplaceResult(Args &&... args)
(since 6.6) bool emplaceResultAt(int index, Args &&... args)
void finish()
QFuture<T> future() const
bool isCanceled() const
void setException(const QException &e)
void setException(std::__exception_ptr::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<T> &operator=(QPromise<T> &&other)
QPromise<T> &operator=(const QPromise<T> &)

Ausführliche Beschreibung

QPromise ist eine Template-Klasse, bei der der Template-Parameter „ T “ den Ergebnistyp angibt, der gespeichert und später über „ QFuture “ abgerufen werden kann.

QPromise bietet eine einfache Möglichkeit, den Fortschritt und die Ergebnisse der benutzerdefinierten Berechnung asynchron an „ QFuture “ zu übermitteln. Damit die Kommunikation funktioniert, muss „ QFuture “ von QPromise instanziiert werden.

Sie können QPromise-basierte Workloads als Alternative zum Qt Concurrent Framework nutzen, wenn eine fein abgestimmte Steuerung erforderlich ist oder eine hochrangige Kommunikationsprimitive zur Ergänzung von „ QFuture “ ausreicht.

Der einfachste Fall der Zusammenarbeit zwischen „Promise“ und „Future“ wäre eine Kommunikation mit einem einzigen Ergebnis:

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

    const std::unique_ptr<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 ist von seiner Konzeption her ein „Move-only“-Objekt. Dieses Verhalten trägt dazu bei, dass bei jeder Zerstörung des Promises das zugehörige Future-Objekt benachrichtigt wird und nicht endlos darauf wartet, dass die Ergebnisse verfügbar werden. Dies ist jedoch unpraktisch, wenn man dasselbe Promise verwenden möchte, um Ergebnisse aus verschiedenen Threads zu melden. Derzeit gibt es dafür keine spezielle Möglichkeit, aber es existieren bekannte Mechanismen, wie beispielsweise die Verwendung von Smart-Pointern oder Raw-Pointern/Referenzen. „ QSharedPointer “ ist eine gute Standardwahl, wenn Sie Ihr Promise kopieren und an mehreren Stellen gleichzeitig verwenden möchten. Raw-Zeiger oder -Referenzen sind in gewisser Weise einfacher und wahrscheinlich leistungsfähiger (da keine Ressourcenverwaltung erforderlich ist), können jedoch zu „Dangling“-Problemen führen.

Hier ist ein Beispiel dafür, wie ein Promise in mehreren Threads verwendet werden kann:

    const auto sharedPromise = std::make_shared<QPromise<int>>();
    QFuture<int> future = sharedPromise->future();

    // ...

    sharedPromise->start();

    // here, QPromise is shared between threads via a smart pointer
    const std::unique_ptr<QThread> threads[] = {
        std::unique_ptr<QThread>(QThread::create([] (auto sharedPromise) {
            sharedPromise->addResult(0, 0);  // adds value 0 by index 0
        }, sharedPromise)),
        std::unique_ptr<QThread>(QThread::create([] (auto sharedPromise) {
            sharedPromise->addResult(-1, 1);  // adds value -1 by index 1
        }, sharedPromise)),
        std::unique_ptr<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

    sharedPromise->finish();

Siehe auch QFuture.

Dokumentation zu Member-Funktionen

[default] QPromise::QPromise()

Erstellt ein QPromise mit einem Standardzustand.

[delete] QPromise::QPromise(const QPromise<T> &)

Erstellt eine Instanz von „ QPromise “ durch Kopieren. Diese Funktion wurde gelöscht.

[default] QPromise::QPromise(QPromise<T> &&other)

„Move“ erstellt ein neues `QPromise` aus ` other`.

Siehe auch ` operator=()`.

QPromise::~QPromise()

Löst das Promise auf.

Hinweis: Das Versprechen wechselt bei der Zerstörung implizit in den Status „abgebrochen“, es sei denn, der Benutzer ruft zuvor finish() auf.

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

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

Entspricht

emplaceResultAt(index, result);            // first overload
emplaceResultAt(index, std::move(result)); // second overload

oder, falls index == -1 (Standard)

emplaceResult(result);            // first overload
emplaceResult(std::move(result)); // second overload

Siehe auch ` emplaceResultAt()`, ` emplaceResult()` und ` addResults()`.

[since 6.6] bool QPromise::addResults(const QList<T> &results)

Fügt „ results “ am Ende der internen Ergebnissammlung hinzu.

Gibt „ true “ zurück, wenn „ results “ zur Sammlung hinzugefügt wurden.

Gibt „ false “ zurück, wenn sich dieses Promise im Status „canceled“ oder „finished“ befindet.

Dies ist effizienter als eine Schleife über ` addResult()` zu durchlaufen, da zugehörige Futures nur einmal pro Aufruf von `addResults()` benachrichtigt werden, anstatt einmal pro Element in ` results`, wie es bei einzelnen Aufrufen von ` addResult()` der Fall wäre. Wenn die Berechnung jedes Elements jedoch Zeit in Anspruch nimmt, kann der Code auf der Empfängerseite (Future) erst dann fortfahren, wenn alle Ergebnisse gemeldet wurden. Verwenden Sie diese Funktion daher nur, wenn die Berechnung aufeinanderfolgender Elemente relativ schnell erfolgt.

Diese Funktion wurde in Qt 6.6 eingeführt.

Siehe auch addResult().

[since 6.6] template <typename... Args, std::enable_if_t<std::is_constructible_v<T, Args...>, bool> = true> bool QPromise::emplaceResult(Args &&... args)

[since 6.6] template <typename... Args, std::enable_if_t<std::is_constructible_v<T, Args...>, bool> = true> bool QPromise::emplaceResultAt(int index, Args &&... args)

Fügt ein aus ` args... ` erstelltes Ergebnis an der Position ` index ` (emplaceResultAt()) oder am Ende der Sammlung (emplaceResult()) zur internen Ergebnissammlung hinzu.

Gibt ` true ` zurück, wenn das Ergebnis zur Sammlung hinzugefügt wurde.

Gibt „ false “ zurück, wenn sich dieses Promise im Status „canceled“ oder „finished“ befindet oder wenn das Ergebnis abgelehnt wurde. „ addResult()“ lehnt das Hinzufügen eines Ergebnisses ab, wenn sich bereits ein anderes Ergebnis an derselben Indexposition in der Sammlung befindet.

Diese Funktionen sind nur an der Auflösung von Überladungen beteiligt, wenn „ T “ aus args....

Sie können ein Ergebnis an einem bestimmten Index abrufen, indem Sie QFuture::resultAt() aufrufen.

Hinweis: Es ist möglich, einen beliebigen Index anzugeben und das Ergebnis an diesem Index abzufragen. Einige Methoden von „ QFuture “ arbeiten jedoch mit fortlaufenden Ergebnissen. Dies gilt beispielsweise für iterative Ansätze, die „ QFuture::resultCount()“ oder „ QFuture::const_iterator “ verwenden. Um alle verfügbaren Ergebnisse abzurufen, ohne berücksichtigen zu müssen, ob Indexlücken vorhanden sind oder nicht, verwenden Sie „ QFuture::results()“.

Diese Funktionen wurden in Qt 6.6 eingeführt.

Siehe auch „ addResult()“ und „ addResults()“.

void QPromise::finish()

Meldet, dass die Berechnung abgeschlossen ist. Nach Abschluss der Berechnung werden beim Aufruf von „ addResult()“ keine neuen Ergebnisse mehr hinzugefügt. Diese Methode ergänzt „ start()“.

Siehe auch QFuture::isFinished(), QFuture::waitForFinished() und start().

QFuture<T> QPromise::future() const

Gibt ein mit diesem Promise verknüpftes Future zurück.

bool QPromise::isCanceled() const

Gibt zurück, ob die Berechnung mit der Funktion ` QFuture::cancel()` abgebrochen wurde. Der Rückgabewert ` true ` zeigt an, dass die Berechnung beendet und ` finish()` aufgerufen werden sollte.

Hinweis: Nach dem Abbruch kann weiterhin auf die derzeit verfügbaren Ergebnisse zugegriffen werden, es werden jedoch keine neuen Ergebnisse hinzugefügt, wenn addResult() aufgerufen wird.

void QPromise::setException(const QException &e)

Setzt die Ausnahme „ e “ als Ergebnis der Berechnung.

Hinweis: Während der gesamten Ausführung der Berechnungkann höchstens eine Ausnahme festgelegtwerden .

Hinweis: Diese Methode hat nach dem Aufruf von ` QFuture::cancel()` oder ` finish()` keine Wirkung.

Siehe auch ` isCanceled()`.

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

Dies ist eine überladene Funktion.

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

Legt den Fortschrittsbereich der Berechnung auf den Bereich zwischen minimum und maximum fest.

Ist maximum kleiner als minimum, ist minimum der einzig zulässige Wert.

Der Fortschrittswert wird auf minimum zurückgesetzt.

Die Verwendung des Fortschrittsbereichs kann mit `setProgressRange(0, 0)` deaktiviert werden. In diesem Fall wird der Fortschrittswert ebenfalls auf 0 zurückgesetzt.

Siehe auch „ QFuture::progressMinimum()“, „ QFuture::progressMaximum()“ und „ QFuture::progressValue()“.

void QPromise::setProgressValue(int progressValue)

Setzt den Fortschrittswert der Berechnung auf „ progressValue “. Es ist nur möglich, den Fortschrittswert zu erhöhen. Dies ist eine Komfortmethode zum Aufruf von „ setProgressValueAndText(progressValue, QString())“.

Falls der Wert „ progressValue “ außerhalb des Fortschrittsbereichs liegt, hat diese Methode keine Wirkung.

Siehe auch ` QFuture::progressValue()` und ` setProgressRange()`.

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

Setzt den Fortschrittswert und den Fortschrittstext der Berechnung auf „ progressValue “ bzw. „ progressText “. Es ist möglich, nur den Fortschrittswert zu erhöhen.

Hinweis: Diese Funktion hat keine Auswirkung, wenn sich das Promise im Status „canceled“ oder „finished“ befindet.

Siehe auch QFuture::progressValue(), QFuture::progressText(), QFuture::cancel() und finish().

void QPromise::start()

Meldet, dass die Berechnung gestartet wurde. Der Aufruf dieser Methode ist wichtig, um den Beginn der Berechnung zu kennzeichnen, da die Methoden von ` QFuture ` auf diese Information angewiesen sind.

Hinweis: Besondere Vorsicht ist geboten, wenn `start()` von einem neu erstellten Thread aus aufgerufen wird. In einem solchen Fall kann es aufgrund der Implementierungsdetails der Thread-Planung zu einer natürlichen Verzögerung des Aufrufs kommen.

Siehe auch ` QFuture::isStarted()`, ` QFuture::waitForFinished()` und ` finish()`.

void QPromise::suspendIfRequested()

Hält den aktuellen Ausführungsthread bedingt an und wartet, bis er durch die entsprechenden Methoden von ` QFuture` wieder aufgenommen oder abgebrochen wird. Diese Methode blockiert nicht, es sei denn, die Berechnung soll durch ` QFuture::suspend()` oder eine andere verwandte Methode angehalten werden. Wenn Sie überprüfen möchten, ob die Ausführung angehalten wurde, verwenden Sie ` QFuture::isSuspended()`.

Hinweis: Bei Verwendung desselben Promises in mehreren Threads wird aus ` QFuture::isSuspended()` die Methode ` true `, sobald mindestens ein Thread mit dem Promise angehalten wird.

Die folgenden Codeausschnitte veranschaulichen die Verwendung des Unterbrechungsmechanismus:

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

    promise.start();
    // Start a computation thread that supports suspension and cancellation
    const std::unique_ptr<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() fordert das zugehörige Promise auf, die Ausführung auszusetzen:

    future.suspend();

Nachdem aus „ QFuture::isSuspended()“ „ true “ geworden ist, können Sie Zwischenergebnisse abrufen:

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

Im angehaltenen Zustand können Sie die ausstehende Berechnung fortsetzen oder abbrechen:

    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

Siehe auch „ QFuture::resume()“, „ QFuture::cancel()“, „ QFuture::setSuspended()“ und „ QFuture::toggleSuspended()“.

[noexcept] void QPromise::swap(QPromise<T> &other)

Ersetzt dieses Versprechen durch „ other “. Dieser Vorgang ist sehr schnell und schlägt niemals fehl.

[noexcept] QPromise<T> &QPromise::operator=(QPromise<T> &&other)

Mit „move“ wird „ other “ diesem Promise zugewiesen und eine Referenz auf dieses Promise zurückgegeben.

[delete] QPromise<T> &QPromise::operator=(const QPromise<T> &)

other Weist dieser Instanz von „ QPromise “ den Wert „ “ zu. Diese Funktion wird gelöscht.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.