【发布时间】:2017-09-12 05:22:19
【问题描述】:
我有一个简单的例子,当我尝试调用context()->moveToThread(render_thread_); 时,这个程序崩溃了。任何人都可以帮忙吗?
class FrameRenderer: public QThread
{
Q_OBJECT
public:
FrameRenderer(QGLCanvas *parent):m_parent(parent), QThread(){}
void run() Q_DECL_OVERRIDE;
QGLCanvas *m_parent;
};
class QGLCanvas : public QOpenGLWidget, protected QOpenGLFunctions
{
Q_OBJECT
public:
QGLCanvas(QWidget* parent = NULL);
~QGLCanvas();
virtual void initializeGL();
virtual void paintGL();
virtual void resizeGL(int width, int height);
void DrawThreadEntry();
FrameRenderer* render_thread_;
};
void FrameRenderer::run()
{
m_parent->DrawThreadEntry();
}
QGLCanvas::QGLCanvas(QWidget* parent)
: QOpenGLWidget(parent)
{
render_thread_ = new FrameRenderer(this);
doneCurrent();
context()->moveToThread(render_thread_);
render_thread_->start();
}
void QGLCanvas::DrawThreadEntry()
{
while(true)
{
makeCurrent();
QOpenGLFunctions f;
f.initializeOpenGLFunctions();
f.glClearColor(1.0, 1.0, 1.0, 1.0);
f.glFinish();
doneCurrent();
emit update();
}
}
【问题讨论】:
-
Qt 中的一个基本规则是只能在主线程中更新 GUI,称为 GUI 线程。
-
@eyllanesc 但是当我将上下文移动到线程时它崩溃了。我评论了发射线,它仍然崩溃了。
-
context()->moveToThread(render_thread_);嗯...检查为空? QOpenGLContext *QOpenGLWidget::context() const 返回此小部件使用的 QOpenGLContext,如果尚未初始化,则返回 0。 -
@AlexanderVX moveToThread 调用开始得太早了?我应该在创建上下文后使用 Timer 来移动它吗?