Domanda Qt Threading Issues in Linux


Da qualche tempo sto sviluppando con Qt sul mio progetto e stiamo iniziando a passare a un design più orientato ai thread. Dopo aver spostato alcuni widget di rendering GL su altri thread, ho scoperto alcuni comportamenti molto strani. Sembra che se un GL Widget inizia l'aggiornamento da un altro thread (boost thread o QThread) prima che un widget che accetta l'input dell'utente (come QTextEdit) acquisisca lo stato attivo, ottengo degli arresti anomali di XCB che assomigliano a:

[xcb] Too much data requested from _XRead
[xcb] This is most likely caused by a broken X extension library
[xcb] Aborting, sorry about that.
hypnotizer: ../../src/xcb_io.c:735: _XRead: Assertion ‘!xcb_xlib_too_much_data_requested’ failed.

Per verificarlo, in realtà posso apportare una semplice modifica alla demo di GLHypnotizer per riprodurre il crash. Quella demo può essere trovata qui: http://qt-project.org/doc/qt-4.8/demos-glhypnotizer.html [Qt-project.org]

Se aggiungo la riga "mdiArea.addSubWindow (new QTextEdit (this));" alla riga 313 (prima della chiamata a newThread ()), quando inizia la demo ci sarà un QTextEdit e un GL Hypnotizer Widget. Se poi clicco su QTextEdit per catturare l'attenzione, avrò sempre il crash sopra riportato.

Qualcuno può riprodurre l'errore su Linux installare utilizzando le istruzioni di cui sopra? Qualcuno ha riscontrato questo tipo di problemi su Linux usando Qt e threading prima?

Nota: sto usando Ubuntu 12 e questo arresto si verifica nelle installazioni di Ubuntu VirtualBox e non VirtualBox


11
2017-10-16 16:17


origine


risposte:


OpenGL, rendering Qt e multithreading non si combinano bene. In particolare un contesto OpenGL può essere attivo in un solo thread alla volta. Ora se il contesto è condiviso tra più widget (si noti che questo è diverso dalla condivisione di oggetti tra i contesti, sto parlando di un singolo contesto che viene utilizzato per più finestre / widget che è legittimo) e quei widget rendono da diversi thread che stai andando per entrare in molti problemi.

Di solito il miglior modo di agire quando si tratta di OpenGL e multithreading è, non farlo. Usa più thread, sì, ma li usa per tutto ciò che non è correlato a OpenGL o ad alcun tipo di output grafico. Mantieni tutte le operazioni grafiche su un singolo thread per evitare problemi importanti.


2
2017-10-16 16:33