C++ 重新打开FreeGLUT窗口

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

我尝试在用户关闭FreeGLUT窗口后重新打开它

我通过两个应用程序来实现。一个可行,另一个失败。由于这个错误而失败的那个有什么问题

freeglut非法glutInit()重新初始化尝试

main_ok.cpp:

#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专家。