Qt Concurrent
Das Modul „ Qt Concurrent “ stellt High-Level-APIs bereit, die es ermöglichen, Multithread-Programme zu schreiben, ohne auf Low-Level-Threading-Primitive wie Mutexe, Lese-/Schreibsperren, Wartebedingungen oder Semaphoren zurückgreifen zu müssen. Mit „ Qt Concurrent “ geschriebene Programme passen die Anzahl der verwendeten Threads automatisch an die Anzahl der verfügbaren Prozessorkerne an. Das bedeutet, dass heute geschriebene Anwendungen auch in Zukunft skalierbar bleiben, wenn sie auf Multi-Core-Systemen eingesetzt werden.
Qt Concurrent enthält APIs im Stil der funktionalen Programmierung für die parallele Listenverarbeitung, darunter eine MapReduce- und FilterReduce-Implementierung für Shared-Memory-Systeme (nicht verteilte Systeme) sowie Klassen zur Verwaltung asynchroner Berechnungen in GUI-Anwendungen:
- Concurrent Map und Map-Reduce
- QtConcurrent::map() wendet eine Funktion auf jedes Element in einem Container an und ändert die Elemente an Ort und Stelle.
- QtConcurrent::mapped() verhält sich wie map(), gibt jedoch einen neuen Container mit den Änderungen zurück.
- QtConcurrent::mappedReduced() verhält sich wie `mapped()`, mit dem Unterschied, dass die modifizierten Ergebnisse zu einem einzigen Ergebnis reduziert oder zusammengefasst werden.
- Paralleles „Filter“ und „Filter-Reduce“
- QtConcurrent::filter() entfernt alle Elemente aus einem Container basierend auf dem Ergebnis einer Filterfunktion.
- QtConcurrent::filtered() funktioniert ähnlich wie filter(), mit dem Unterschied, dass es einen neuen Container mit den gefilterten Ergebnissen zurückgibt.
- QtConcurrent::filteredReduced() funktioniert ähnlich wie `filtered()`, mit dem Unterschied, dass die gefilterten Ergebnisse zu einem einzigen Ergebnis reduziert oder zusammengefasst werden.
- Paralleler Lauf
- QtConcurrent::run() führt eine Funktion in einem anderen Thread aus.
- Parallele Aufgabe
- QtConcurrent::task() erstellt eine Instanz von ` QtConcurrent::QTaskBuilder`. Dieses Objekt kann zum Anpassen von Parametern und zum Starten einer Aufgabe in einem separaten Thread verwendet werden.
- QFuture stellt das Ergebnis einer asynchronen Berechnung dar.
- QFutureIterator Ermöglicht das Durchlaufen der über ` QFuture` verfügbaren Ergebnisse.
- QFutureWatcher ermöglicht die Überwachung eines „ QFuture “ mithilfe von Signalen und Slots.
- QFutureSynchronizer ist eine Komfortklasse, die mehrere QFutures automatisch 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, wenn dies von ` QFuture` angefordert wird.
Qt Concurrent unterstützt mehrere STL-kompatible Container- und Iterator-Typen, funktioniert jedoch am besten mit Qt-Containern, die über Iteratoren mit wahlfreiem Zugriff verfügen, wie z. B. ` QList`. Die Funktionen `map` und `filter` akzeptieren sowohl Container als auch Start- und End-Iteratoren.
Übersicht über die STL-Iterator-Unterstützung:
| Iterator-Typ | Beispielklassen | Unterstützungsstatus |
|---|---|---|
| Eingabe-Iterator | Nicht unterstützt | |
| Ausgabe-Iterator | Nicht unterstützt | |
| Vorwärts-Iterator | std::forward_list | Unterstützt |
| Bidirektionaler Iterator | std::list | Unterstützt |
| Iterator mit wahlfreiem Zugriff | QList, std::vector | Unterstützt und empfohlen |
Iteratoren mit wahlfreiem Zugriff können in Fällen, in denen „ Qt Concurrent “ eine große Anzahl von leichtgewichtigen Elementen durchläuft, schneller sein, da sie das Springen zu einem beliebigen Punkt im Container ermöglichen. Darüber hinaus ermöglicht die Verwendung von Iteratoren mit wahlfreiem Zugriff es „ Qt Concurrent “, Fortschrittsinformationen über „ QFuture::progressValue()“ und „ QFutureWatcher::progressValueChanged()“ bereitzustellen.
Die Funktionen, die keine Änderungen an Ort und Stelle vornehmen, wie z. B. `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 Start- und End-Iteratoren des Containers anzugeben.
Verwendung des Moduls
Die Verwendung eines Qt-Moduls erfordert die 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.
Erstellen 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 „Erstellen mit CMake “.
Erstellen mit qmake
Um das Modul für die Erstellung mit qmake zu konfigurieren, fügen Sie das Modul als Wert der Variablen „ QT “ in die .pro-Datei des Projekts ein:
QT += concurrentBeispiele
Modul-Entwicklung
Unter„Änderungen an Qt Concurrent “ sind wichtige Änderungen an der Modul-API und der Funktionalität aufgeführt, 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 Softwarelizenzen verfügbar: der GNU Lesser General Public License, Version 3, oder der GNU General Public License, Version 2. Weitere Informationen finden Sie unter „Qt-Lizenzierung “.
© 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.