从并行线程在主 Maya 线程上执行代码

Posted

技术标签:

【中文标题】从并行线程在主 Maya 线程上执行代码【英文标题】:Execute code on Main Maya Thread from Parallel Thread 【发布时间】: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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

以上是关于从并行线程在主 Maya 线程上执行代码的主要内容,如果未能解决你的问题,请参考以下文章

从 boost 线程在主线程上运行一个函数并将参数传递给该函数

多线程提交Spark Job

NSThread detachNewThreadSelector 在主线程上执行

GCD主队列是不是必须在主线程上执行?

Python线程库:代码线性执行而不是并行执行

关于多线程提高程序执行速率的问题