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连接到不同线程中的套接字

C ++中的多线程文件散列[关闭]

在不同的设备上显示不同的图像[关闭]

C#随机数生成器线程安全吗?

对于不同的虚拟主机,如何在同一 Linux 服务器上放置不同的主机条目? [关闭]

同一 fd 上不同线程中的多个 libevent 基础