Qt Concurrent
El módulo Qt Concurrent proporciona APIs de alto nivel que hacen posible escribir programas multihilo sin utilizar primitivas de threading de bajo nivel como mutexes, bloqueos de lectura-escritura, condiciones de espera o semáforos. Los programas escritos con Qt Concurrent ajustan automáticamente el número de hilos utilizados en función del número de núcleos de procesador disponibles. Esto significa que las aplicaciones escritas hoy seguirán escalando cuando se desplieguen en sistemas multinúcleo en el futuro.
Qt Concurrent incluye APIs de estilo de programación funcional para el procesamiento paralelo de listas, incluyendo una implementación de MapReduce y FilterReduce para sistemas de memoria compartida (no distribuidos), y clases para gestionar cálculos asíncronos en aplicaciones GUI:
- Concurrent Map y Map-Reduce
- QtConcurrent::map() aplica una función a cada elemento de un contenedor, modificando los elementos in situ.
- QtConcurrent::mapped() es como map(), salvo que devuelve un nuevo contenedor con las modificaciones.
- QtConcurrent::mappedReduced() es como map(), salvo que los resultados modificados se reducen o se pliegan en un único resultado.
- Filtro concurrente y filtro-reducción
- QtConcurrent::filter() elimina todos los elementos de un contenedor basándose en el resultado de una función de filtro.
- QtConcurrent::filtered() es como filter(), salvo que devuelve un nuevo contenedor con los resultados filtrados.
- QtConcurrent::filteredReduced() es como filter(), salvo que los resultados filtrados se reducen o pliegan en un único resultado.
- Ejecución concurrente
- QtConcurrent::run() ejecuta una función en otro subproceso.
- Tarea concurrente
- QtConcurrent::task() crea una instancia de QtConcurrent::QTaskBuilder. Este objeto puede utilizarse para ajustar parámetros y para iniciar una tarea en un subproceso distinto.
- QFuture representa el resultado de un cálculo asíncrono.
- QFutureIterator permite iterar a través de los resultados disponibles mediante QFuture.
- QFutureWatcher permite supervisar un QFuture utilizando señales y ranuras.
- QFutureSynchronizer es una clase de conveniencia que sincroniza automáticamente varios QFutures.
- QPromise proporciona una forma de informar del progreso y los resultados de la computación asíncrona a QFuture. Permite suspender o cancelar la tarea cuando lo solicite QFuture.
Qt Concurrent admite varios tipos de contenedores e iteradores compatibles con STL, pero funciona mejor con contenedores Qt que tengan iteradores de acceso aleatorio, como QList. Las funciones map y filter aceptan tanto contenedores como iteradores begin/end.
Visión general del soporte de iteradores STL:
| Tipo de iterador | Clases de ejemplo | Estado de soporte |
|---|---|---|
| Iterador de entrada | No soportado | |
| Iterador de salida | No soportado | |
| Iterador de reenvío | std::lista_de_avance | Soportado |
| Iterador bidireccional | std::lista | Soportado |
| Iterador de acceso aleatorio | QListstd::vector | Soportado y recomendado |
Los iteradores de acceso aleatorio pueden ser más rápidos en los casos en los que Qt Concurrent está iterando sobre un gran número de elementos ligeros, ya que permiten saltar a cualquier punto del contenedor. Además, el uso de iteradores de acceso aleatorio permite a Qt Concurrent proporcionar información de progreso a través de QFuture::progressValue() y QFutureWatcher::progressValueChanged().
Las funciones de modificación no in-place como mapped() y filtered() realizan una copia del contenedor cuando son llamadas. Si estás utilizando contenedores STL esta operación de copia puede tardar algún tiempo, en este caso recomendamos especificar los iteradores begin y end para el contenedor en su lugar.
Uso del módulo
Usar un módulo Qt requiere enlazar con la librería del módulo, ya sea directamente o a través de otras dependencias. Varias herramientas de compilación tienen soporte dedicado para esto, incluyendo CMake y qmake.
Construir con CMake
Utilice el comando find_package() para localizar los componentes del módulo necesarios en el paquete Qt6:
find_package(Qt6 REQUIRED COMPONENTS Concurrent) target_link_libraries(mytarget PRIVATE Qt6::Concurrent)
Véase también la descripción general de la compilación con CMake.
Construcción con qmake
Para configurar el módulo para su compilación con qmake, añada el módulo como valor de la variable QT en el archivo .pro del proyecto:
QT += concurrent
Ejemplos
Evolución del módulo
Cambios en Qt Concurrent enumera los cambios importantes en la API del módulo y la funcionalidad que se hicieron para la serie Qt 6 de Qt.
Licencias
El módulo Qt Concurrent está disponible bajo licencias comerciales de The Qt Company. Además, está disponible bajo licencias de software libre: La GNU Lesser General Public License, versión 3, o la GNU General Public License, versión 2. Vea Licencias Qt para más detalles.
© 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.