Я уже некоторое время разрабатываю свой проект с помощью Qt, и мы начинаем переходить к более многопоточному дизайну. При перемещении некоторых виджетов рендеринга GL в другие потоки я обнаружил очень странное поведение. Похоже, что если GL Widget начинает обновляться из другого потока (boost thread или QThread) до того, как виджет, который принимает пользовательский ввод (например, QTextEdit), захватывает фокус, я получаю сбои XCB, которые выглядят следующим образом:
[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.
Чтобы проверить это, я на самом деле могу сделать простую модификацию демо-версии GLHypnotizer, чтобы воспроизвести сбой. Эту демонстрацию можно найти здесь: http://qt-project.org/doc/qt-4.8/demos-glhypnotizer.html [qt-project.org]
Если я добавлю строку «mdiArea.addSubWindow(new QTextEdit(this));» примерно в строке 313 (перед вызовом newThread()), то при запуске демонстрации будет QTextEdit и виджет GL Hypnotizer. Если я затем нажму на QTextEdit, чтобы захватить фокус, я каждый раз буду получать вышеупомянутый сбой.
Может ли кто-нибудь воспроизвести ошибку при установке Linux, используя приведенные выше инструкции? Кто-нибудь сталкивался с такими проблемами в Linux, используя Qt и многопоточность раньше?
Примечание. Я использую Ubuntu 12, и этот сбой происходит в установках VirtualBox и Ubuntu, отличных от VirtualBox.