Primärer Zähler
Zeigt, wie man den Fortschritt von gleichzeitigen Operationen überwacht.
Das folgende Beispiel zeigt, wie man eine interaktive und nicht-blockierende QtWidgets-Anwendung mit der Klasse QFutureWatcher und den filteredReduced-Funktionen von Qt Concurrent. Mit diesem Beispiel kann der Benutzer eine QList von Ganzzahlen erstellen, deren Größe verändert werden kann. Die Liste wird automatisch mit natürlichen Zahlen von 1 bis n gefüllt. Das Programm sucht dann nach Primzahlen in der Liste und zeigt die Gesamtzahl der gefundenen Primzahlen an.
Ausführen des Beispiels
Zum Ausführen des Beispiels von Qt Creatorzu starten, öffnen Sie den Modus Welcome und wählen Sie das Beispiel aus Examples. Weitere Informationen finden Sie unter Erstellen und Ausführen eines Beispiels.
Einrichten der Verbindungen
Die Qt Concurrent Bibliothek bietet die filteredReduced-Funktionen, die in zwei Modi arbeiten können: OrderedReduce and UnorderedReduce. Im Modus OrderedReduce
wird die Reduktionsfunktion in der Reihenfolge der ursprünglichen Sequenz aufgerufen, während im Modus UnorderedReduce
der Zugriff auf die Elemente zufällig erfolgt.
Nachdem die Benutzeroberfläche mit den gewünschten Elementen konfiguriert wurde, müssen diese mit Hilfe des Qt Signals & Slots Mechanismus mit den Signalen der gleichzeitigen Operationen verbunden werden. In diesem Beispiel verwenden wir die Klasse QFutureWatcher, um den Fortschritt der gleichzeitigen Operationen zu überwachen und die für die Implementierung der interaktiven Benutzeroberfläche erforderlichen Signale bereitzustellen.
... 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); ...
Die Klasse QFutureWatcher spielt in diesem Beispiel eine wichtige Rolle, da sie die Signale bereitstellt, die zur Aktualisierung der Benutzeroberfläche als Reaktion auf Änderungen in den gleichzeitigen Operationen erforderlich sind.
Starten der gleichzeitigen Operation
Nach dem Verbinden aller Signale und Steckplätze und wenn der Benutzer den QPushButton drückt, wird die Funktion start()
aufgerufen.
In der Funktion start()
rufen wir die Funktion filteredReduced von Qt Concurrent auf und setzen den future auf das Mitglied QFutureWatcher. Um sicherzustellen, dass dieser Vorgang wirklich gleichzeitig abläuft, geben wir als ersten Parameter eine separate QThreadPool an. Dieser Ansatz vermeidet auch ein mögliches Blockieren im globalen Thread-Pool. Wir übergeben die QList von Ganzzahlen als Container, eine statische Filter- und Reduktionsfunktion und schließlich das ReduceOption Flag.
... 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)); ...
Schauen wir uns die Filter- und Reduktionsfunktionen an. Diese Funktionen werden in diesem Beispiel als statisch deklariert, da sie von keiner Mitgliedsvariablen abhängen. Sie könnten jedoch problemlos als Lambdas oder Mitgliedsfunktionen angegeben werden.
Die Filterfunktion markiert Elemente für die anschließende Reduktion mit der Reduktionsfunktion. Diese Implementierung ist ein einfacher Prime-Filter. Da diese Funktion eine const-Referenz als Argument annimmt, ermöglicht sie einen thread-sicheren Betrieb auf dem Container, auf dem sie arbeitet.
... 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; } ...
Die Funktion reduce nimmt als ersten Parameter eine veränderbare Referenz des gleichen Typs wie der Container, auf dem sie operiert. Der zweite Parameter ist das zuvor gefilterte Element aus der Filterfunktion. In diesem Beispiel wird die Anzahl der Primzahlen gezählt.
... void PrimeCounter::reduceFunction(Element &out, const Element &value) { // Count the amount of primes. Q_UNUSED(value); ++out; } ...
© 2025 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.