En esta página

Tecnologías Multithreading en Qt

Qt ofrece muchas clases y funciones para trabajar con hilos. A continuación se muestran cuatro enfoques diferentes que los programadores de Qt pueden utilizar para implementar aplicaciones multihilo.

QThread: API de bajo nivel con bucles de eventos opcionales

QThread es la base de todo el control de hilos en Qt. Cada instancia de QThread representa y controla un hilo.

QThread puede instanciarse directamente o subclasificarse. Instanciar un QThread proporciona un bucle de eventos paralelo, permitiendo que las ranuras QObject sean invocadas en un hilo secundario. Subclasificar un QThread permite a la aplicación inicializar el nuevo hilo antes de iniciar su bucle de eventos, o ejecutar código paralelo sin un bucle de eventos.

Ver QThread class reference y los ejemplos de hilos para demostraciones de cómo usar QThread.

QThreadPool y QRunnable: Reutilización de hilos

Crear y destruir hilos frecuentemente puede ser costoso. Para reducir esta sobrecarga, los hilos existentes pueden ser reutilizados para nuevas tareas. QThreadPool es una colección de QThreads reutilizables.

Para ejecutar código en uno de los hilos de QThreadPool, reimplemente QRunnable::run() e instancie la subclase QRunnable. Utilice QThreadPool::start() para poner QRunnable en la cola de ejecución de QThreadPool. Cuando un subproceso esté disponible, el código de QRunnable::run() se ejecutará en ese subproceso.

Cada aplicación Qt tiene un pool de hilos global, accesible a través de QThreadPool::globalInstance(). Este pool global de hilos mantiene automáticamente un número óptimo de hilos basado en el número de núcleos de la CPU. Sin embargo, se puede crear y gestionar explícitamente un QThreadPool independiente.

Qt Concurrent: Uso de una API de alto nivel

El módulo Qt Concurrent proporciona funciones de alto nivel que se ocupan de algunos patrones comunes de computación paralela: map, filter y reduce. A diferencia del uso de QThread y QRunnable, estas funciones nunca requieren el uso de primitivas de enhebrado de bajo nivel como mutexes o semáforos. En su lugar, devuelven un objeto QFuture que puede utilizarse para recuperar los resultados de las funciones cuando estén listos. QFuture también puede utilizarse para consultar el progreso del cálculo y para pausar/reanudar/cancelar el cálculo. Para mayor comodidad, QFutureWatcher permite interactuar con QFuturea través de señales y ranuras.

Qt ConcurrentLos algoritmos map, filter y reduce de distribuyen automáticamente el cálculo entre todos los núcleos de procesamiento disponibles, de modo que las aplicaciones escritas hoy seguirán escalando cuando se desplieguen más adelante en un sistema con más núcleos.

Este módulo también proporciona la función QtConcurrent::run(), que puede ejecutar cualquier función en otro subproceso. Sin embargo, QtConcurrent::run() sólo soporta un subconjunto de funciones disponibles para las funciones map, filter y reduce. La función QFuture se puede utilizar para recuperar el valor de retorno de la función y para comprobar si el hilo se está ejecutando. Sin embargo, una llamada a QtConcurrent::run() sólo utiliza un subproceso, no se puede pausar/reanudar/cancelar y no se puede consultar el progreso.

Consulte la documentación del módulo Qt Concurrent para más detalles sobre las funciones individuales.

WorkerScript: Subprocesos en QML

El tipo QML WorkerScript permite que el código JavaScript se ejecute en paralelo con el subproceso GUI.

Cada instancia de WorkerScript puede tener un script .js adjunto. Cuando se llama a WorkerScript.sendMessage(), el script se ejecutará en un hilo separado (y en un QML context separado). Cuando el script termina de ejecutarse, puede enviar una respuesta al hilo GUI que invocará al manejador de señales WorkerScript.onMessage().

Utilizar un WorkerScript es similar a utilizar un QObject trabajador que ha sido movido a otro hilo. Los datos se transfieren entre hilos a través de señales.

Consulte la documentación de WorkerScript para más detalles sobre cómo implementar la secuencia de comandos, y para obtener una lista de los tipos de datos que se pueden pasar entre hilos.

Eligiendo un Enfoque Apropiado

Como se ha demostrado anteriormente, Qt proporciona diferentes soluciones para el desarrollo de aplicaciones con subprocesos. La solución adecuada para una aplicación dada depende del propósito del nuevo hilo y del tiempo de vida del hilo. A continuación se muestra una comparación de las tecnologías de hilos de Qt, seguida de las soluciones recomendadas para algunos casos de uso de ejemplo.

Comparación de soluciones

CaracterísticaQThreadQRunnable y QThreadPoolQtConcurrent::run()Qt Concurrent (Map, Filter, Reduce)WorkerScript
LenguajeC++C++C++C++QML
Se puede especificar la prioridad de los hilos
El hilo puede ejecutar un bucle de eventos
El hilo puede recibir actualizaciones de datos a través de señalesSí (recibidas por un trabajador QObject)Sí (recibido por WorkerScript)
El hilo puede ser controlado mediante señalesSí (recibido por QThread)Sí (recibido por QFutureWatcher)
Thread puede ser controlado a través de un QFutureParcialmente
Capacidad integrada de pausar/reanudar/cancelar

Ejemplos de uso

Duración del hiloOperaciónSolución
Una llamadaEjecutar una nueva función lineal dentro de otro hilo, opcionalmente con actualizaciones de progreso durante la ejecución.Qt proporciona diferentes soluciones:
Una llamadaEjecutar una función existente dentro de otro subproceso y obtener su valor de retorno.Ejecute la función utilizando QtConcurrent::run(). Haz que QFutureWatcher emita la señal finished() cuando la función haya retornado, y llama a QFutureWatcher::result() para obtener el valor de retorno de la función.
Una llamadaRealiza una operación en todos los elementos de un contenedor, utilizando todos los núcleos disponibles. Por ejemplo, producir miniaturas a partir de una lista de imágenes.Utilice la función QtConcurrent::filter() de Qt Concurrent para seleccionar los elementos del contenedor, y la función QtConcurrent::map() para aplicar una operación a cada elemento. Para plegar la salida en un único resultado, utilice en su lugar QtConcurrent::filteredReduced() y QtConcurrent::mappedReduced().
Una llamada/PermanenteRealice un cálculo largo en una aplicación QML pura y actualice la interfaz gráfica de usuario cuando los resultados estén listos.Coloque el código de cálculo en un script .js y adjúntelo a una instancia WorkerScript. Llama a WorkerScript.sendMessage() para iniciar el cálculo en un nuevo hilo. Deje que el script llame a sendMessage() también, para pasar el resultado al hilo GUI. Maneje el resultado en onMessage y actualice la GUI allí.
PermanenteTener un objeto viviendo en otro hilo que pueda realizar diferentes tareas bajo petición y/o pueda recibir nuevos datos con los que trabajar.Subclase un QObject para crear un trabajador. Instancie este objeto trabajador y un QThread. Mueva el trabajador al nuevo hilo. Envía comandos o datos al objeto worker a través de conexiones de cola de señales.
PermanenteRealizar repetidamente una operación costosa en otro hilo, donde el hilo no necesita recibir ninguna señal o evento.Escribir el bucle infinito directamente dentro de una reimplementación de QThread::run(). Iniciar el hilo sin un bucle de eventos. Dejar que el hilo emita señales para enviar datos al hilo GUI.

© 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.