2017-09-12 104 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()這是負責設置上下文

相關問題