thread example multithreading qt

multithreading - example - ¿Cómo hacer que Qt funcione cuando el hilo principal está ocupado?



qthread exec (3)

La hebra principal (función principal está allí) de mi programa está reservada para tareas que no son de GUI. Llama a varias funciones de cálculo largas. Todas las GUI implementadas han estado haciendo su trabajo en hilos separados.

Ahora voy a implementar una GUI más usando Qt. La documentación de Qt dice que todas las tareas relacionadas con GUI deben hacerse en el hilo principal. En mi caso, insertar llamadas ocasionales de QCoreApplication :: processEvents () en el hilo principal sería prácticamente inútil debido a grandes retrasos entre ellas.

¿Hay alguna manera de superar esta restricción de Qt? ¿Es imposible hacer algo que no esté relacionado con la GUI en el hilo principal del programa Qt?


Lo mejor es descargar los cálculos largos en otros subprocesos para que el hilo principal de la GUI siga siendo receptivo. La forma de hacer uniprocessing de la vieja escuela consistiría en asegurarse de que sus cálculos nunca se ejecuten durante demasiado tiempo sin un controlador de eventos de GUI de sondeo, pero eso no se escala a multinúcleos.

Afortunadamente, Qt tiene un excelente soporte de enhebrado . En el pasado, tendrías que enrollar tu propio sistema para, por ejemplo, cultivar tareas en un grupo de subprocesos usando QThread , QMutex , QWaitCondition , etc., pero las versiones recientes de Qt han facilitado las cosas con abstracciones de nivel superior como QThreadPool , QtConcurrent::run y QFuture .


No sé cómo irán las cosas si llama a QApplication :: exec () desde otro hilo, que luego se convierte en su hilo de interfaz gráfica de usuario. Solo una idea.

(Háganos saber si funciona, sería interesante ...)


No, deberías estar haciendo tus cálculos en un hilo separado. Como ya lo mencionó, hay una QCoreApplication::processEvents() disponible en QCoreApplication::processEvents() , pero parece que no puede hacer eso por usted.

Si no quiere tener que hacer todo el trabajo de configurar un QThread y mover todo su código, puede encontrar que la función QtConcurrent::run es útil: le permite ejecutar una función de forma asíncrona.

Algunos consejos: Debería tratar de mantener su hilo principal (GUI) tan claro como sea posible. Grandes cantidades de IO o cálculos deben hacerse de forma asincrónica utilizando QtConcurrent :: run, o ejecutarse dentro de un QThread por separado. Dependiendo de la complejidad de su código, es posible que pueda salirse con la suya con el método QtConcurrent.