Prime Counter
Démontre comment surveiller la progression d'opérations concurrentes.
L'exemple suivant montre comment créer une application QtWidgets interactive et non bloquante en utilisant la classe QFutureWatcher et les fonctions filteredReduced de Qt Concurrent. Dans cet exemple, l'utilisateur peut créer une liste QList d'entiers qui peut être redimensionnée. La liste sera automatiquement remplie avec des nombres naturels allant de 1 à n. Le programme recherchera ensuite les nombres premiers dans la liste et affichera le nombre total de nombres premiers trouvés.

Exécution de l'exemple
Pour exécuter l'exemple à partir de Qt Creatorouvrez le mode Welcome et sélectionnez l'exemple de Examples. Pour plus d'informations, voir Qt Creator: Tutoriel : Construire et exécuter.
Mise en place des connexions
La bibliothèque Qt Concurrent fournit les fonctions filteredReduced, qui peuvent fonctionner selon deux modes : OrderedReduce and UnorderedReduce. En mode OrderedReduce, la fonction de réduction est appelée dans l'ordre de la séquence originale, tandis qu'en mode UnorderedReduce, les éléments sont accédés de manière aléatoire.
Après avoir configuré l'interface utilisateur avec les éléments souhaités, il est nécessaire de les connecter aux signaux des opérations concurrentes en utilisant le mécanisme Qt Signals & Slots. Dans cet exemple, nous utilisons la classe QFutureWatcher pour surveiller la progression des opérations concurrentes et fournir les signaux nécessaires à la mise en œuvre de l'interface graphique interactive.
... connect(ui->pushButton, &QPushButton::clicked, this, [this] { start(); }); connect(&watcher, &QFutureWatcher<Element>::finished, this, [this] { finish(); }); connect(&watcher, &QFutureWatcher<Element>::progressRangeChanged, ui->progressBar, &QProgressBar::setRange); connect(&watcher, &QFutureWatcher<Element>::progressValueChanged, ui->progressBar, &QProgressBar::setValue); ...
La classe QFutureWatcher joue un rôle essentiel dans cet exemple, car elle fournit les signaux nécessaires à la mise à jour de l'interface utilisateur en réponse aux modifications apportées aux opérations simultanées.
Démarrage de l'opération concurrente
Après avoir connecté tous les signaux et emplacements, et lorsque l'utilisateur appuie sur le bouton QPushButton, la fonction start() est appelée.
Dans la fonction start(), nous appelons la fonction filteredReduced de Qt Concurrent et définissons le futur sur le membre QFutureWatcher. Pour garantir que cette opération s'exécute réellement de manière simultanée, nous spécifions un QThreadPool distinct comme premier paramètre. Cette approche permet également d'éviter tout blocage éventuel dans le pool de threads global. Nous passons le conteneur QList d'entiers, un filtre statique et une fonction de réduction, et enfin le drapeau ReduceOption.
... void PrimeCounter::start() { if (ui->pushButton->isChecked()) { ui->comboBox->setEnabled(false); ui->pushButton->setText(tr("Cancel")); ui->labelResult->setText(tr("Calculating ...")); ui->labelFilter->setText(tr("Selected Reduce Option: %1").arg(ui->comboBox->currentText())); fillElementList(ui->horizontalSlider->value() * stepSize); timer.start(); watcher.setFuture( QtConcurrent::filteredReduced( &pool, elementList, filterFunction, reduceFunction, currentReduceOpt | QtConcurrent::SequentialReduce)); ...
Examinons les fonctions de filtrage et de réduction. Ces fonctions sont déclarées statiques dans cet exemple car elles ne dépendent d'aucune variable membre. Cependant, elles pourraient facilement être spécifiées comme des lambdas ou des fonctions membres.
La fonction de filtrage marque les éléments en vue d'une réduction ultérieure par la fonction de réduction. Cette implémentation est un simple filtre primaire. Comme cette fonction prend une référence constante comme argument, elle permet une opération thread-safe sur le conteneur sur lequel elle opère.
... bool PrimeCounter::filterFunction(const Element &element) { // Filter for primes if (element <= 1) return false; for (Element i = 2; i*i <= element; ++i) { if (element % i == 0) return false; } return true; } ...
La fonction reduce prend comme premier paramètre une référence modifiable du même type que le conteneur sur lequel elle opère. Le second paramètre est l'élément précédemment filtré par la fonction filter. Dans cet exemple, nous comptons le nombre de nombres premiers.
... void PrimeCounter::reduceFunction(Element &out, const Element &value) { // Count the amount of primes. Q_UNUSED(value); ++out; } ...
© 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.