【问题标题】:Execute code on Main Maya Thread from Parallel Thread从并行线程在主 Maya 线程上执行代码
【发布时间】:2016-12-08 09:41:13
【问题描述】:

在 MacOS 上开发 Maya API 插件,我试图在并行线程中进行一些繁重的计算,然后将结果存储在 OpenGL VBO 中。

线程的创建和执行工作正常,直到我需要执行 GL 操作,当 Maya 崩溃时。

我使用CGLEnable( CGLGetCurrentContext(), kCGLCEMPEngine); 在 OpenGL 上启用了多线程,但这并没有帮助。 因此,我的想法是在并行线程上进行计算,并在完成后在主线程中进行 GL 处理。

如何从并行线程在主线程上执行某些功能?

{ // Main thread
    MStatus stat = MThreadAsync::init();
    if( MStatus::kSuccess != stat ) {
        MString str = MString("Error creating MThreadAsync");
        MGlobal::displayError(str);
    }
    else
    {
        MThreadAsync::createTask(createOpenGLVBOs, NULL ,NULL);
    }
}

void createOpenGLVBOs(void *data) // PARALLEL THREAD
{
...heavy calculations...
    GLuint nb;
    glGenBuffers(1, &nb); --> CRASH
}

【问题讨论】:

    标签: c++ multithreading macos opengl maya


    【解决方案1】:

    我很确定在后台调用任何 OpenGL 函数都会使应用程序崩溃。

    OpenGL 调用只能在主线程中调用。

    您可以使用数据填充共享数据结构,执行并行计算,然后在主线程上执行所有 opengl 调用。

    或者,您可以使用 std::condition_variable 从后台线程向主线程发出信号,并让主线程在后台线程执行工作时调用 opengl 调用。您应该使用自旋锁或互斥锁来保护共享数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-19
      • 2021-10-16
      • 2012-06-22
      • 2017-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多