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

Execute code on Main Maya Thread from Parallel Thread

本文关键字:线程 执行 Maya 代码 并行      更新时间:2023-10-16

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

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

我使用 OpenGL 启用了多线程CGLEnable( CGLGetCurrentContext(), kCGLCEMPEngine);但这没有帮助。 因此,我的想法是在并行线程上进行计算,完成后在主线程中执行 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
}

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

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

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

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