如何多线程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不会在窗口中绘制任何东西。下面是我使用的多线程代码:
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
是一个类成员变量,要么只对函数参数使用下划线符号。
相关文章:
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- Java从C++回调到C++回调
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 从不同的 cpp 调用回调函数会导致bad_function_call
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 不带轮询的 SDL2 事件回调
- C++存储带有可变参数的回调
- 如何使用 Node-addon-API 实现 node-nan 回调
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 访问类C++ C 样式回调
- OpenCV 为键盘事件设置回调
- 处理键盘输入的回调
- 低级键盘钩子:回调未到达
- 如何多线程glfw键盘回调