Qopenglwidget将上下文移至另一个线程崩溃

QOpenGLWidget move context to another thread crash

本文关键字:另一个 线程 崩溃 上下文 Qopenglwidget      更新时间:2023-10-16

我有一个简单的示例,当我尝试调用 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();
    }
}

我不知道它是否是解决方案,但是我在iOS上有类似的问题,上下文可用,但是在短时间后。

您可以尝试添加一条言论并将您的电话延迟到OpenGL

.h

slots:
   void update();

.cpp

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

如果工作正常,也许您应该尝试一下,如果您可以在 void qopenglwidget :: initializegl()内进行移动,则负责设置上下文