如何多线程glfw键盘回调

How to multithreading glfw keyboard callback?

本文关键字:键盘 回调 glfw 多线程      更新时间:2023-10-16

我正在创建一个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不会在窗口中绘制任何东西。下面是我使用的多线程代码:

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;
}

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

创建GLFW窗口后,由此创建的OpenGL上下文将在创建该窗口的线程中生效。在你使OpenGL上下文在另一个线程中是当前的之前,它必须在当前持有它的线程中被释放(非当前)。因此,持有上下文的线程必须在新线程调用glfwMakeCurrent(windowHandle)之前调用glfwMakeContextCurrent(NULL)——要么在启动新线程之前,要么通过使用同步对象(互斥锁,信号量)。


BTW:以下划线_开头的符号是为全局命名空间上的编译器保留的,所以要么确保_windowHandle是一个类成员变量,要么只对函数参数使用下划线符号。