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
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?
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.
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 –
? 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. –
- 1. ¿Debo usar multiplicación o división?
- 2. ¿Debo usar Phobos o Tango?
- 3. ¿Debo usar alias o alias_method?
- 4. ¿Debo usar herencia o composición?
- 5. ¿Debo usar em o px?
- 6. ¿Debo usar eval() o call_user_func()?
- 7. ¿Debo usar byte o int?
- 8. ¿Debo usar CouchDB o SimpleDB?
- 9. ¿Debo usar Pilones o Pirámide?
- 10. ¿Debo usar Flash o Flex?
- 11. ¿Debo usar int o UInt16?
- 12. ¿Debo usar doble o flotar?
- 13. Debo usar DataInputStream o BufferedInputStream
- 14. ¿Debo usar ArrayList o IList
- 15. ¿Debo usar horquilla o hilos?
- 16. ¿Debo usar Meteor.startup() o $ (function() {})
- 17. ¿Debo usar AppDomain.CurrentDomain.BaseDirectory o System.Environment.CurrentDirectory?
- 18. ¿Cómo puedo usar Clojure REPL junto con Qt Jambi?
- 19. ¿Debo usar Module :: Install o Module :: Build?
- 20. ¿Debo usar ApplyUpdates (0) o ApplyUpdates (-1)?
- 21. Debo usar Python 32bit o Python 64bit
- 22. ¿Debo usar `import os.path` o` import os`?
- 23. ¿Debo usar WCF o conectores crudos?
- 24. ¿Debo usar window.load o document.ready jQuery
- 25. ¿Debo usar window.onload o script block?
- 26. android view o surfaceView, ¿qué debo usar?
- 27. Numpy: ¿Debo usar newaxis o None?
- 28. ¿Debo usar Drupal 6 o Drupal 7?
- 29. Debo usar Sleep() o simplemente negarlos
- 30. enum o define, ¿cuál debo usar?
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 –
@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. –