从Parallel Thread在Main Maya Thread上执行代码

时间:2016-12-08 09:41:13

标签: c++ multithreading macos opengl maya

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

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

我使用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
}

1 个答案:

答案 0 :(得分:1)

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

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

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

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