如何多线程glfw键盘回调?

How to multithreading glfw keyboard callback?

我正在创建一个 opengl 应用程序,当我不使用多线程时它运行良好。原代码如下所示:

void Controller::BeginLoop()    
{    
    while (!glfwWindowShouldClose(_windowHandle)) {    
        /* Render here */     
        Render();    

        /* Swap front and back buffers */     
        glfwSwapBuffers(_windowHandle);

        /* Poll for and process events */     
        glfwPollEvents(); 
    }     
}    

int main()
{
    //do some initialization
    g_controller->BeginLoop();
}

上面的代码运行良好,但是,当我尝试将事件轮询和渲染放入两个不同的线程时,OpenGL 不会在 window 中绘制任何东西。下面是我使用的多线程代码:

void Controller::BeginLoop()    
{    
    while (!glfwWindowShouldClose(_windowHandle)) {  

        glfwMakeContextCurrent(_windowHandle);

        /* Render here */     
        Render();    

        /* Swap front and back buffers */     
        glfwSwapBuffers(_windowHandle);
    }     
}    



void Render(int argc, char **argv)
{
    ::g_controller->BeginLoop();
}

int main()
{

    std::thread renderThread(Render, argc, argv);

    while (true) {
        glfwPollEvents();
    }

    renderThread.join();

    return 0;
}

在渲染函数中,我做了一些物理并将结果点绘制到 window 上。 我完全不知道出了什么问题。

创建 GLFW window 后,由此创建的 OpenGL 上下文将在创建 window 的线程中成为当前线程。在使 OpenGL 上下文在另一个线程中成为当前上下文之前,必须在当前持有它的线程中释放(使其成为非当前)。因此,持有上下文的线程必须在新线程调用 glfwMakeCurrent(windowHandle) 之前调用 glfwMakeContextCurrent(NULL)——在启动新线程之前或通过使用同步对象(互斥锁、信号量)。


顺便说一句:下划线 _ 开头的符号在全局命名空间中为编译器保留,因此请确保 _windowHandle 是 class 成员变量或仅使用下划线符号对于函数参数。