QPromise Class
template <typename T> class QPromiseLa classe QPromise permet de stocker des résultats de calcul auxquels QFuture peut accéder. En savoir plus...
| En-tête : | #include <QPromise> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake : | QT += core |
| Depuis : | Qt 6.0 |
- Liste de tous les membres, y compris les membres hérités
- QPromise fait partie des classes de multithreading.
Remarque : toutes les fonctions de cette classe sont sûres pour les threads.
Fonctions publiques
| 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> &) |
Description détaillée
QPromise est une classe de modèle dont le paramètre de modèle T spécifie le type de résultat pouvant être stocké puis consulté via QFuture.
QPromise offre un moyen simple de communiquer de manière asynchrone la progression et les résultats du calcul défini par l’utilisateur à ` QFuture `. Pour que la communication fonctionne, ` QFuture ` doit être instancié par QPromise.
Vous pouvez utiliser des charges de travail basées sur QPromise comme alternative au Qt Concurrent un framework lorsqu’un contrôle fin est nécessaire ou qu’une primitive de communication de haut niveau accompagnant QFuture suffit.
Le cas le plus simple de collaboration entre une « promise » et un « future » serait une communication à résultat unique :
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 42De par sa conception, QPromise est un objet « move-only ». Ce comportement permet de garantir que, chaque fois que la promesse est détruite, l’objet « future » associé en est informé et n’attendra pas indéfiniment que les résultats soient disponibles. Cependant, cela s’avère peu pratique si l’on souhaite utiliser la même promesse pour signaler des résultats provenant de différents threads. Il n’existe pour l’instant aucune méthode spécifique pour y parvenir, mais des mécanismes connus existent, tels que l’utilisation de pointeurs intelligents ou de pointeurs bruts/références. ` QSharedPointer ` est un bon choix par défaut si vous souhaitez copier votre `promise` et l’utiliser simultanément à plusieurs endroits. Les pointeurs bruts ou les références sont, en quelque sorte, plus simples et offrent probablement de meilleures performances (puisqu’il n’est pas nécessaire de gérer les ressources), mais peuvent entraîner des situations de « dangling ».
Voici un exemple illustrant comment une promesse peut être utilisée dans plusieurs threads :
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();Voir également QFuture.
Documentation sur les fonctions membres
[default] QPromise::QPromise()
Crée un objet QPromise avec un état par défaut.
[delete] QPromise::QPromise(const QPromise<T> &)
Copie et construit une instance de ` QPromise`. Cette fonction a été supprimée.
[default] QPromise::QPromise(QPromise<T> &&other)
La fonction `Move` crée une nouvelle instance de `QPromise` à partir de ` other`.
Voir également operator=().
QPromise::~QPromise()
Annule la promesse.
Remarque : la promesse passe implicitement à l'état « annulé » lors de sa destruction, à moins que l'utilisateur n'ait préalablement appelé la méthode ` finish()`.
bool QPromise::addResult(T &&result, int index = -1)
bool QPromise::addResult(const T &result, int index = -1)
Equivalent à
emplaceResultAt(index, result); // first overload
emplaceResultAt(index, std::move(result)); // second overloadou, si index == -1 (valeur par défaut)
emplaceResult(result); // first overload
emplaceResult(std::move(result)); // second overloadVoir également emplaceResultAt(), emplaceResult() et addResults().
[since 6.6] bool QPromise::addResults(const QList<T> &results)
Ajoute results à la fin de la collection de résultats interne.
Renvoie true lorsque results sont ajoutés à la collection.
Renvoie false lorsque cette promesse est à l'état « canceled » ou « finished ».
Cette méthode est plus efficace qu’une boucle sur addResult(), car les futures associées ne seront notifiées qu’une seule fois par appel à addResults(), au lieu d’une fois par élément contenu dans results, comme ce serait le cas avec des appels individuels à addResult(). Cependant, si le calcul de chaque élément prend du temps, le code du côté récepteur (future) ne peut pas progresser tant que tous les résultats n’ont pas été signalés ; n’utilisez donc cette fonction que si le calcul d’éléments consécutifs est relativement rapide.
Cette fonction a été introduite dans Qt 6.6.
Voir également 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)
Ajoute un résultat construit à partir de ` args... ` à la collection interne de résultats, à la position ` index ` (emplaceResultAt()) ou à la fin de la collection (emplaceResult()).
Renvoie true lorsque le résultat a été ajouté à la collection.
Renvoie false lorsque cette promesse est à l'état « canceled » ou « finished », ou lorsque le résultat a été rejeté. addResult() rejette l'ajout d'un résultat s'il existe déjà un autre résultat dans la collection stocké au même index.
Ces fonctions ne participent à la résolution des surcharges que si ` T ` est constructible à partir de args....
Vous pouvez récupérer un résultat à un index spécifique en appelant ` QFuture::resultAt()`.
Remarque : il est possible de spécifier un index arbitraire et de demander le résultat à cet index. Cependant, certaines méthodes d’ QFuture fonctionnent avec des résultats continus. Par exemple, les approches itératives qui utilisent QFuture::resultCount() ou QFuture::const_iterator. Afin d’obtenir tous les résultats disponibles sans se soucier de l’existence éventuelle de lacunes dans les index, utilisez QFuture::results().
Ces fonctions ont été introduites dans Qt 6.6.
Voir également addResult() et addResults().
void QPromise::finish()
Indique que le calcul est terminé. Une fois terminé, aucun nouveau résultat ne sera ajouté lors de l'appel de la méthode ` addResult()`. Cette méthode accompagne la méthode ` start()`.
Voir également QFuture::isFinished(), QFuture::waitForFinished() et start().
QFuture<T> QPromise::future() const
Renvoie un « future » associé à cette « promise ».
bool QPromise::isCanceled() const
Indique si le calcul a été annulé à l'aide de la fonction QFuture::cancel(). La valeur renvoyée true indique que le calcul doit être terminé et que la fonction finish() doit être appelée.
Remarque : après l'annulation, les résultats actuellement disponibles restent accessibles par une future, mais aucun nouveau résultat ne sera ajouté lors de l'appel de la fonction addResult().
void QPromise::setException(const QException &e)
Définit l'e e d'exception comme étant le résultat du calcul.
Remarque : vous ne pouvez définir qu’une seule exception au cours de l’exécution du calcul.
Remarque : cette méthode n’a aucun effet après l’appel de ` QFuture::cancel()` ou ` finish()`.
Voir également isCanceled().
void QPromise::setException(std::__exception_ptr::exception_ptr e)
Il s'agit d'une fonction surchargée.
void QPromise::setProgressRange(int minimum, int maximum)
Définit la plage de progression du calcul entre minimum et maximum.
Si maximum est inférieur à minimum, minimum devient la seule valeur valide.
La valeur de progression est réinitialisée à minimum.
L'utilisation de la plage de progression peut être désactivée à l'aide de setProgressRange(0, 0). Dans ce cas, la valeur de progression est également réinitialisée à 0.
Voir également QFuture::progressMinimum(), QFuture::progressMaximum() et QFuture::progressValue().
void QPromise::setProgressValue(int progressValue)
Définit la valeur de progression du calcul sur progressValue. Seule une augmentation de la valeur de progression est autorisée. Il s'agit d'une méthode pratique permettant d'appeler setProgressValueAndText(progressValue, QString()).
Si la valeur de progression ( progressValue ) sort de la plage autorisée, cette méthode n'a aucun effet.
Voir également QFuture::progressValue() et setProgressRange().
void QPromise::setProgressValueAndText(int progressValue, const QString &progressText)
Définit respectivement la valeur de progression et le texte de progression du calcul sur progressValue et progressText. Il est possible de n'incrémenter que la valeur de progression.
Remarque : cette fonction n'a aucun effet si la promesse est à l'état « canceled » (annulée) ou « finished » (terminée).
Voir également QFuture::progressValue(), QFuture::progressText(), QFuture::cancel() et finish().
void QPromise::start()
Indique que le calcul a démarré. L'appel de cette méthode est important pour signaler le début du calcul, car les méthodes de l QFuture ation s'appuient sur cette information.
Remarque : une attentionparticulière est requise lorsque la méthode start() est appelée depuis un thread nouvellement créé. Dans ce cas, l'appel peut naturellement être retardé en raison des détails d'implémentation de la planification des threads.
Voir également QFuture::isStarted(), QFuture::waitForFinished() et finish().
void QPromise::suspendIfRequested()
Suspends conditionnellement le thread d’exécution actuel et attend qu’il soit repris ou annulé par les méthodes correspondantes de ` QFuture`. Cette méthode ne bloque pas, sauf si la suspension du calcul est demandée par ` QFuture::suspend()` ou une autre méthode associée. Si vous souhaitez vérifier que l’exécution a bien été suspendue, utilisez ` QFuture::isSuspended()`.
Remarque : lorsque la même promesse est utilisée dans plusieurs threads, ` QFuture::isSuspended()` devient ` true ` dès qu’au moins un thread contenant la promesse est suspendu.
Les extraits de code suivants illustrent l'utilisation du mécanisme de suspension :
// 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() demande à la promesse associée de se suspendre :
future.suspend();Une fois que QFuture::isSuspended() devient true, vous pouvez récupérer les résultats intermédiaires :
future.resultCount(); // returns some number between 0 and 100
for (int i = 0; i < future.resultCount(); ++i) {
// process results available before suspension
}En cas de suspension, vous pouvez reprendre ou annuler le calcul en attente :
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 99Voir également QFuture::resume(), QFuture::cancel(), QFuture::setSuspended() et QFuture::toggleSuspended().
[noexcept] void QPromise::swap(QPromise<T> &other)
Remplace cette promesse par other. Cette opération est très rapide et ne rate jamais.
[noexcept] QPromise<T> &QPromise::operator=(QPromise<T> &&other)
La méthode `move` attribue ` other ` à cette promesse et renvoie une référence à celle-ci.
[delete] QPromise<T> &QPromise::operator=(const QPromise<T> &)
Copie et attribue « other » à cette instance « QPromise ». Cette fonction est supprimée.
© 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.