在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
}
答案 0 :(得分:1)
我很确定在后台调用任何OpenGL函数会使应用程序崩溃。
只应在主线程中调用OpenGL调用。
您可以使用数据填充共享数据结构,执行并行计算,然后在主线程上执行所有opengl调用。
或者,您可以使用std :: condition_variable从后台线程向主线程发出信号,并让主线程在后台线程完成工作时调用opengl调用。您应该使用自旋锁或互斥锁来保护共享数据。