C++ 重新打开FreeGLUT窗口
我尝试在用户关闭FreeGLUT窗口后重新打开它 我通过两个应用程序来实现。一个可行,另一个失败。由于这个错误而失败的那个有什么问题 freeglut非法glutInit()重新初始化尝试 main_ok.cpp:C++ 重新打开FreeGLUT窗口,c++,c,opengl,glut,freeglut,C++,C,Opengl,Glut,Freeglut,我尝试在用户关闭FreeGLUT窗口后重新打开它 我通过两个应用程序来实现。一个可行,另一个失败。由于这个错误而失败的那个有什么问题 freeglut非法glutInit()重新初始化尝试 main_ok.cpp: #include "header.h" int main() { // 1 init_gui(); glutMainLoop(); // 2 init_gui(); while(1) { glutMainLo
#include "header.h"
int main()
{
// 1
init_gui();
glutMainLoop();
// 2
init_gui();
while(1)
{
glutMainLoopEvent();
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
return 0;
}
main_fail.cpp:
#include "header.h"
void refresh_gui()
{
if(glutGetWindow())
glutPostRedisplay();
else
init_gui();
glutMainLoopEvent();
}
void calculations()
{
while(1)
{
refresh_gui();
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
int main()
{
init_gui();
calculations();
return 0;
}
标题h:
#include <chrono>
#include <thread>
#include <GL/freeglut.h>
void timer(int)
{
if(!glutGetWindow())
return ;
glutPostRedisplay();
glutMainLoopEvent();
glutTimerFunc(30, timer, 1);
}
void display()
{
if(!glutGetWindow())
return ;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
}
void init_gui()
{
int argc=1;
glutInit(&argc, nullptr);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowPosition(100, 100);
glutInitWindowSize(512, 512);
glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS);
glutCreateWindow("freegluttest");
glutDisplayFunc(display);
glutTimerFunc(30, timer, 1);
}
#包括
#包括
#包括
无效计时器(int)
{
如果(!glutGetWindow())
返回;
再发现();
glutMainLoopEvent();
glutTimerFunc(30,定时器,1);
}
无效显示()
{
如果(!glutGetWindow())
返回;
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glClearColor(1.0f、1.0f、1.0f、1.0f);
}
void init_gui()
{
int argc=1;
glutInit(&argc,nullptr);
glutInitDisplayMode(GLUT_双精度| GLUT_深度);
位置(100100);
glutInitWindowSize(512、512);
glutSetOption(GLUT\U操作\U打开\U窗口\U关闭,GLUT\U操作\U GLUTMAINLOOP\U返回);
glutCreateWindow(“freegluttest”);
glutDisplayFunc(显示器);
glutTimerFunc(30,定时器,1);
}
我认为这与SO链接上处理的另一个问题非常相似:。通读这个答案,它解释了一种处理上下文的方法。@Harish,我在使用glutMainLoopEvent阅读部件时没有得出任何结论。我应该如何释放这些资源?遗憾的是,我不认为GLUT公开了您正在寻找的功能。如果您自己控制windows和opengl上下文,就可以做到这一点。参考这个答案。您仍然可以使用第一个有效的方法。@Harish,根据这个解释,我应该如何修改代码?我不是openGL专家。