Glut,不同线程C ++中的不同上下文[关闭]
Posted
技术标签:
【中文标题】Glut,不同线程C ++中的不同上下文[关闭]【英文标题】:Glut, different context in different thread C++ [closed] 【发布时间】:2015-04-09 12:48:54 【问题描述】:我试图在不同的上下文中使用不同的过剩窗口,我的意思是,每个窗口都有自己的显示回调,空闲...
所以我有一些关于过剩的问题:
第一次尝试:
glutInit在程序开始,线程后-> 当我关闭一个窗口时,发生了错误:
freeglut ERROR: Internal <Event Handler> function called without first calling 'glutInit'.
第二次尝试:
每个线程中的glutInit: 当第二个线程启动时:
freeglut illegal glutInit() reinitialization attempt
【问题讨论】:
differents glut window in differents context
-> 我不明白它的真正含义。清楚地解释什么是设计。你有多少线程?有多少个窗户?实际调用 OpenGL 例程的线程有多少?
我有 2 个线程(除了主线程)。每个代表一个上下文:一个窗口、回调和 glutMainLoop()
AFAIK、GLUT 和多线程不能一起使用。参见例如documentation for glutMainLoop
:“这个例程应该在 GLUT 程序中最多调用一次。”使用像 GLFW 这样更现代的库,您可能会更幸运。
【参考方案1】:
GLUT 在设计时并未考虑线程安全(甚至根本不支持多线程)。所以我担心,有了 GLUT,你将无法实现你想要的。但是,GLFW 在这方面似乎要好得多:
线程安全
大多数 GLFW 函数只能从主线程调用,但有些 可以从任何线程调用。但是,不能调用 GLFW 函数 从任何其他线程直到 GLFW 已成功初始化 主线程,包括之前可能调用的函数 初始化。
每个 GLFW 函数的参考文档都说明了它是否 仅限于主线程。
以下类别的功能将继续限于 主线程由于一个或多个平台的限制:
初始化和终止 事件处理 窗口、上下文和光标对象的创建和销毁
这部分在你的情况下似乎很重要:
可以在任何线程上进行渲染。以下上下文相关 可以从任何线程调用函数:
glfwMakeContextCurrent glfwGetCurrentContext glfwSwapBuffers glfwSwapInterval glfwExtension支持 glfwGetProcAddress[...]
GLFW 在内部不使用同步对象,除了 线程本地存储以跟踪每个线程的当前上下文 线。同步留给应用程序。
来源:GLFW Doc - Thread Safety
【讨论】:
以上是关于Glut,不同线程C ++中的不同上下文[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
c ++ system()挂起使用netcat连接到不同线程中的套接字