【发布时间】:2014-03-21 20:06:19
【问题描述】:
我一直在尝试解决我的问题一段时间,但到目前为止我没有找到解决方案
我有一个 QT 应用程序,现在我需要在其中添加一个 QWindow 以使用 opengl 进行绘制。
我知道我需要调用 QWidget::createWindowContainer() 来创建可以插入到另一个小部件或主窗口中的 QWidget。 现在,我在我拥有的子类 QWindow 类中创建了一个上下文。当窗户暴露时我会这样做。然后我在我的渲染类所在的地方创建了另一个线程,将 QOpenGLContext 传递给它,使其成为当前的,但无论我尝试什么,它都不起作用。
QWindow 的子类我只是初始化上下文,仅此而已(我在构造函数中设置了表面类型):
void OpenGLWindow::initialize()
{
if (!m_context) {
m_context = new QOpenGLContext();
m_context->setFormat(requestedFormat());
m_context->create();
}
if(!isRunning) {
thread = new ThreadHelper(m_context, this);
thread->start();
}
}
然后是线程助手:
ThreadHelper::ThreadHelper(QOpenGLContext *context, OpenGLWindow *window) :
m_window(window),
m_context(context)
{
}
void ThreadHelper::run()
{
m_context->makeCurrent(m_window);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glClearColor(1.0, 0.0, 0.0, 0.5);
// the rendering is done here, it's a loop, where I loop
// over classes and call the render method
}
void ThreadHelper::swapOpenGLBuffers(){
m_context->swapBuffers(m_window);
}
它在 m_context->makeCurrent(m_window) 行崩溃。
还尝试将上下文移动到另一个线程,但没有成功,我收到一个运行时错误,提示它无法移动。
【问题讨论】:
-
比赛条件可能吗?
-
我不这么认为,但我不知道QT的内部细节。但是据我所知,我不会做任何可能导致比赛条件的事情
-
对于现在阅读本文的任何人,都无需将上下文移动到渲染线程,您可以避免关联问题以及以后与锁定有关的任何事情。在那里(在渲染线程中)创建它,因为你的表面只关心绘画,唯一应该绑定这些类的是
QWindow传递和swapBuffers(...)。
标签: c++ multithreading qt opengl