-1
我有這個簡單的例子,當我試圖撥打context()->moveToThread(render_thread_);
時,這個程序崩潰。誰能幫忙?QOpenGLWidget將上下文移動到另一個線程崩潰
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
@eyllanesc但是當我將上下文移動到線程時它崩潰了。我對發射線發表評論,它平靜地墜毀。 – Johnnylin
閱讀此:http://doc.qt.io/qt-5/thread-basics.html – eyllanesc