2017-09-12 63 views
-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(); 
    } 
} 
+0

Qt中的基本规则是,您只能在主线程中更新GUI,称为GUI线程。 – eyllanesc

+0

@eyllanesc但是当我将上下文移动到线程时它崩溃了。我对发射线发表评论,它平静地坠毁。 – Johnnylin

+0

阅读此:http://doc.qt.io/qt-5/thread-basics.html – eyllanesc

回答

0

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

你可以试试您的来电添加蒂默和延迟OpenGL的

.H

slots: 
    void update(); 

的.cpp

QTimer *timer = new QTimer(this); 
connect(timer, SIGNAL(timeout()), this, SLOT(update())); 
timer->start(1000); 

如果它的工作,也许你应该尝试一下,如果你能做你的动作ToThread里面void QOpenGLWidget :: initializeGL()这是负责设置上下文

相关问题