【问题标题】:QOpenGLWidget move context to another thread crashQOpenGLWidget 将上下文移动到另一个线程崩溃
【发布时间】:2017-09-12 05:22:19
【问题描述】:

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

【问题讨论】:

  • Qt 中的一个基本规则是只能在主线程中更新 GUI,称为 GUI 线程。
  • @eyllanesc 但是当我将上下文移动到线程时它崩溃了。我评论了发射线,它仍然崩溃了。
  • context()->moveToThread(render_thread_); 嗯...检查为空? QOpenGLContext *QOpenGLWidget::context() const 返回此小部件使用的 QOpenGLContext,如果尚未初始化,则返回 0。
  • @AlexanderVX moveToThread 调用开始得太早了?我应该在创建上下文后使用 Timer 来移动它吗?

标签: c++ qt opengl


【解决方案1】:

我不知道这是否是解决方案,但我在 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() 中移动 ToThread,它负责设置上下文

【讨论】:

    猜你喜欢
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 2011-03-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多