Название: Использование OpenGL во втором потоке на Qt Отправлено: Tataina от Июль 07, 2011, 09:48 Доброе утро!
Уже несколько дней бьюсь над тем,чтобы перенести полностью отрисовку изображения из GUI потока в другой. Существует QGLWidget, находящийся в основном потоке, необходимо в другом потоке используя Qt и OpenGL (не QPixmap, QImage и т.д.) сделать картинку и отобразить ее в основном потоке. Поток создается, сигнал-слотовое соединение работает. Вопрос только в том,что не понимаю как и на чем нарисовать OpenGL-командами в другом потоке, и как передать это изображение в основной! Возможно, кто-то сталкивался с подобным. Заранее спасибо! Название: Re: Использование OpenGL во втором потоке на Qt Отправлено: climber от Июль 08, 2011, 08:20 Насколько мне известно гуевый поток может быть только один. Соответсвенно в отдельный поток можно и нужно выносить только обработку данных, а сама отрисовка будет происходить в главном (гуевом) потоке после получения сигнала finished(). Для создания потока обработки данных нужно создать свой класс унаследованный от QThread. Затем переопределяется метод run() под ваши конкретные задачи. Далее запускается созданный поток start(), а в коструктор класса вызвавшего этот дочерний поток вешается
connect(thread, SIGNAL(finished()),this,SLOT(_обработчик конца выполнения потока_)); Таким образом все вычисления и обработки данных в дочернем потоке, а отрисовка в главном потоке. Как то так. Если интересно, подробнее это описано тут http://www.opennet.ru/docs/RUS/qt3_prog/x7810.html (http://www.opennet.ru/docs/RUS/qt3_prog/x7810.html) Название: Re: Использование OpenGL во втором потоке на Qt Отправлено: Tataina от Июль 08, 2011, 09:44 на данный момент я обнаружила статью, в которой якобы приводится пример работы многопоточного приложения.
вот она: http://doc.qt.nokia.com/qq/qq06-glimpsing.html#generaltipshttp://doc.qt.nokia.com/qq/qq06-glimpsing.html#generaltips (http://doc.qt.nokia.com/qq/qq06-glimpsing.html#generaltips) так вот при перекладывании этой проги на Qt4 у меня даже виджет в качестве окошка не оказывается. просто черный экран в углу mainwindow. и я совершенно определенно не нашла в этой проге изменения контекста, и самого рисования пирамидки.. может кто-то сможет помочь? могу выслать исходники программы,написанной под Qt 4.7.. Название: Re: Использование OpenGL во втором потоке на Qt Отправлено: twp от Июль 08, 2011, 14:50 да, было бы неплохо выложить исходники. А в одном потоке все работает ок?
Название: Re: Использование OpenGL во втором потоке на Qt Отправлено: Tataina от Июль 08, 2011, 15:25 Класс наследника QGLWidget
Код: #ifndef GLWIDGET_H Код: #include "glwidget.h" Код: #ifndef GLTHREAD_H Реализация методов: Код: #include "glthread.h" класс AppWindow: Код: #ifndef APPWINDOW_H Код: #include "appwindow.h" Код: #include <QApplication> Название: Re: Использование OpenGL во втором потоке на Qt Отправлено: twp от Июль 08, 2011, 15:35 а можно сам архив проекта приаттачить к теме? Просто создавать весь проект влом :)
Название: Re: Использование OpenGL во втором потоке на Qt Отправлено: Tataina от Июль 08, 2011, 16:16 под Qt creator 2.2.1
Название: Re: Использование OpenGL во втором потоке на Qt Отправлено: twp от Июль 08, 2011, 18:03 ок, попробую на досуге. вообще есть рабочий пример (http://mih.voxindeserto.de/threadedcube.html) Но там используются мютексы что имхо не есть хорошо, возможно есть возможность обойтись без них
Название: Re: Использование OpenGL во втором потоке на Qt Отправлено: Igors от Июль 09, 2011, 11:25 Мои познания в OpenGL допотопны, тоже интересно узнать как это делается. По смыслу вроде нет помех вызывать все ф-ции OpenGL из др. нитки (ведь нужно просто "не в главной" а не "параллельно"). А вот SwapBuffers наверняка завалит систему. Я бы спробовал так
- отключить SwapBuffers и убедиться что все живет - вместо SwapBuffers извлечь пиксели из внутреннего буфера (glReadPixels) и в главной нитке его уже рисовать Не исключено этот примитивный вариант будет работать Название: Re: Использование OpenGL во втором потоке на Qt Отправлено: Tataina от Июль 09, 2011, 16:13 swap действительно это заваливает =) подготовка данных в другом потоке- это очень популярная тема, и на многих форумах это обсуждается, и много где, предлагаются решения, но это не совсем то,что нужно лично для моей задачи. Это поможет улучшить,но все также будет грузить основной поток, который и так нагружен по самое не балуйся..
Пример с немецкого форума еще не проверяла, пыталась решить проблему со своим виджетом, который совсем не хочет отображаться.. Название: Re: Использование OpenGL во втором потоке на Qt Отправлено: twp от Июль 11, 2011, 15:01 доработал я пример и все работает.
Я просто взял пример из книги по OpenGL и адаптировал его к этому приложению. То я и спрашивал, работает ли приложение без использования потока. Это приложение врядли подойдет ибо здесь происходит постоянная перерисовка через каждые 40 мс Лучше за основу взять приложение с немецкого форума. Там отрисовка происходит только когда это действительно необходимо и больше подходит для статических сцен. Насчет SwapBuffers. Он используется в потоке в обоих демках и не валит приложение. Насколько я понял, главное это сделать QGLWidget::makeCurrent() перед операциями отрисовки и SwapBuffers, а после этого - QGLWidget::doneCurrent(). Вообще исходя из этой статьи (http://labs.qt.nokia.com/2011/06/03/threaded-opengl-in-4-8/) , Qt 4.8 и выше будет поддерживать больше возможностей использования потоков в OpenGL |