从并行线程在主 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 线程在主线程上运行一个函数并将参数传递给该函数