如何多线程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 成员变量或仅使用下划线符号对于函数参数。
我正在创建一个 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 成员变量或仅使用下划线符号对于函数参数。