C++ QOpenGLWidget将上下文移动到另一个线程崩溃

C++ QOpenGLWidget将上下文移动到另一个线程崩溃,c++,qt,opengl,C++,Qt,Opengl,我有一个简单的例子,当我试图调用context()->moveToThread(render\u thread)时,这个程序崩溃了。有人能帮忙吗 class FrameRenderer: public QThread { Q_OBJECT public: FrameRenderer(QGLCanvas *parent):m_parent(parent), QThread(){} void run() Q_DECL_OVERRIDE; QGLCanvas *m_pa

我有一个简单的例子,当我试图调用
context()->moveToThread(render\u 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();
    }
}

我不知道这是否是解决方案,但我在iOS上遇到了类似的问题,上下文是可用的,但经过很短的时间

您可以尝试添加timmer并延迟对OpenGL的调用

h

.cpp


如果它正常工作,也许你应该试试看是否可以在void QOpenGLWidget::initializeGL()中移动到线程,它负责设置上下文

Qt中的一个基本规则是,你只能更新主线程中的GUI,称为GUI线程。@eyllanesc但当我将上下文移动到线程时,它崩溃了。我注释了emit行,它仍然崩溃了嗯。。。检查是否为空?QOpenGLContext*QOpenGLWidget::context()const返回此小部件使用的QOpenGLContext,如果尚未初始化,则返回0。@AlexanderVX moveToThread调用启动得太早?我应该在创建上下文后使用计时器来移动它?
slots:
   void update();
QTimer *timer = new QTimer(this); 
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000);