2010-01-27 9 views
11

Tengo un método que se llama desde QThreads y el hilo principal. este método a veces puede tomar mucho tiempo para hacer sus cálculos en un bucle, así que pongo QCoreApplication::processEvents() y esto evita que la GUI se congele. En algún momento había cambiado QCoreApplication::processEvents() por QApplication::processEvents() pero eso causó que la GUI se congelara (estoy bastante seguro de que eso es lo que lo estaba congelando porque desde que devolví QCoreApplication::processEvents() no se ha congelado de nuevo) Estoy en lo cierto al pensar que llama al QApplication::processEvents() desde el hilo principal y QThreads puede congelar la GUI?¿Debo usar QCoreApplication :: processEvents() o QApplication :: processEvents()?

Respuesta

11

Ninguno, processEvent() debe llamarse solo cuando tiene eventos pendientes reales para procesar. Puede encontrar esto útil: How to make Qt work when main thread is busy?

+0

Voy a probar QtConcurrent :: run. ¿Puedo hacer operaciones con la GUI allí o debería seguir emitiendo señales como en el caso de un QThread –

+1

@yan bellavance? Debería emitir señales, ya que estarán en un hilo separado. O puede usar las cosas de QFuture para ayudar, lo que hará una gran cantidad de creación y emisión de señales para usted. –

10

Será mucho mejor que mueva el proceso de larga duración fuera del hilo principal para que no tenga que llamar al processEvents(). Dentro de ese proceso de larga duración, puede emitir cualquier señal que necesite para que la GU tenga suficiente información para hacer actualizaciones, etc. processEvents, sin embargo, es generalmente una muleta para un diseño pobre.

+0

Voy a probar QtConcurrent :: run. ¿Puedo hacer operaciones con la GUI allí o debería seguir emitiendo señales como en el caso de un QThread –

+0

? Las operaciones Gui solo pueden realizarse en el hilo principal. QtConcurrent es una buena idea, especialmente si puede dividir su trabajo para utilizar múltiples núcleos. –