Qt Concurrent
Das Modul Qt Concurrent bietet High-Level-APIs, die es ermöglichen, Multi-Thread-Programme zu schreiben, ohne Low-Level-Threading-Primitive wie Mutexe, Lese- und Schreibsperren, Wartebedingungen oder Semaphoren zu verwenden. Mit Qt Concurrent geschriebene Programme passen die Anzahl der verwendeten Threads automatisch an die Anzahl der verfügbaren Prozessorkerne an. Das bedeutet, dass Anwendungen, die heute geschrieben werden, auch in Zukunft auf Multi-Core-Systemen eingesetzt werden können.
Qt Concurrent enthält APIs im Stil der funktionalen Programmierung für die parallele Listenverarbeitung, einschließlich einer MapReduce- und FilterReduce-Implementierung für Shared-Memory-Systeme (nicht verteilte Systeme), sowie Klassen für die Verwaltung asynchroner Berechnungen in GUI-Anwendungen:
- Concurrent Map und Map-Reduce
- QtConcurrent::map() wendet eine Funktion auf jedes Element in einem Container an und verändert die Elemente an Ort und Stelle.
- QtConcurrent::mapped() ist wie map(), mit dem Unterschied, dass es einen neuen Container mit den Änderungen zurückgibt.
- QtConcurrent::mappedReduced() ist wie mapped(), mit dem Unterschied, dass die geänderten Ergebnisse in ein einziges Ergebnis reduziert oder gefaltet werden.
- Gleichzeitiges Filtern und Filter-Reduce
- QtConcurrent::filter() entfernt alle Elemente aus einem Container auf der Grundlage des Ergebnisses einer Filterfunktion.
- QtConcurrent::filtered() ist wie filter(), mit dem Unterschied, dass es einen neuen Container mit den gefilterten Ergebnissen liefert.
- QtConcurrent::filteredReduced() ist wie filtered(), mit dem Unterschied, dass die gefilterten Ergebnisse in ein einziges Ergebnis reduziert oder gefaltet werden.
- Gleichzeitige Ausführung
- QtConcurrent::run() führt eine Funktion in einem anderen Thread aus.
- Gleichzeitige Aufgabe
- QtConcurrent::task() erzeugt eine Instanz von QtConcurrent::QTaskBuilder. Dieses Objekt kann zum Einstellen von Parametern und zum Starten einer Aufgabe in einem separaten Thread verwendet werden.
- QFuture stellt das Ergebnis einer asynchronen Berechnung dar.
- QFutureIterator ermöglicht die Iteration durch Ergebnisse, die über QFuture verfügbar sind.
- QFutureWatcher ermöglicht die Überwachung einer QFuture mit Signalen und Schlitzen.
- QFutureSynchronizer ist eine Komfortklasse, die automatisch mehrere QFutures synchronisiert.
- QPromise bietet eine Möglichkeit, den Fortschritt und die Ergebnisse der asynchronen Berechnung an QFuture zu melden. Ermöglicht das Anhalten oder Abbrechen der Aufgabe auf Anfrage von QFuture.
Qt Concurrent unterstützt mehrere STL-kompatible Container- und Iterator-Typen, funktioniert aber am besten mit Qt-Containern, die Iteratoren mit wahlfreiem Zugriff haben, wie QList. Die Funktionen map und filter akzeptieren sowohl Container als auch begin/end Iteratoren.
STL Iterator-Unterstützung im Überblick:
Iterator-Typ | Beispiel Klassen | Unterstützungsstatus |
---|---|---|
Eingabe-Iterator | Nicht unterstützt | |
Ausgabe-Iterator | Nicht unterstützt | |
Vorwärts-Iterator | std::slist | Unterstützt |
Bidirektionaler Iterator | std::list | Unterstützt |
Iterator mit wahlfreiem Zugriff | QListstd::vector | Unterstützt und empfohlen |
Iteratoren mit wahlfreiem Zugriff können in Fällen, in denen Qt Concurrent über eine große Anzahl von leichtgewichtigen Elementen iteriert, schneller sein, da sie das Überspringen eines beliebigen Punktes im Container erlauben. Darüber hinaus ermöglicht die Verwendung von Iteratoren mit wahlfreiem Zugriff Qt Concurrent die Bereitstellung von Fortschrittsinformationen durch QFuture::progressValue() und QFutureWatcher::progressValueChanged().
Die Funktionen, die nicht an Ort und Stelle modifizieren, wie mapped() und filtered(), erstellen beim Aufruf eine Kopie des Containers. Wenn Sie STL-Container verwenden, kann dieser Kopiervorgang einige Zeit in Anspruch nehmen. In diesem Fall empfehlen wir, stattdessen die Anfangs- und End-Iteratoren für den Container anzugeben.
Verwendung des Moduls
Die Verwendung eines Qt-Moduls erfordert eine Verknüpfung mit der Modulbibliothek, entweder direkt oder über andere Abhängigkeiten. Mehrere Build-Tools bieten hierfür spezielle Unterstützung, darunter CMake und qmake.
Bauen mit CMake
Verwenden Sie den Befehl find_package()
, um die benötigten Modulkomponenten im Paket Qt6
zu finden:
find_package(Qt6 REQUIRED COMPONENTS Concurrent) target_link_libraries(mytarget PRIVATE Qt6::Concurrent)
Siehe auch die Übersicht Bauen mit CMake.
Bauen mit qmake
Um das Modul für die Erstellung mit qmake zu konfigurieren, fügen Sie das Modul als Wert der Variable QT
in der .pro-Datei des Projekts hinzu:
QT += concurrent
Beispiele
Entwicklung des Moduls
Änderungen an Qt Concurrent listet wichtige Änderungen an der Modul-API und -Funktionalität auf, die für die Qt 6-Serie von Qt vorgenommen wurden.
Lizenzen
Das Modul Qt Concurrent ist unter kommerziellen Lizenzen von The Qt Company erhältlich. Darüber hinaus ist es unter freien Software-Lizenzen verfügbar: Die GNU Lesser General Public License, Version 3, oder die GNU General Public License, Version 2. Siehe Qt-Lizenzierung für weitere Details.
© 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.