Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
openGL createWindow在应用程序代码结束前不会执行_Opengl - Fatal编程技术网

openGL createWindow在应用程序代码结束前不会执行

openGL createWindow在应用程序代码结束前不会执行,opengl,Opengl,我有一个程序,允许用户通过对话框选择图像,并显示图像。菜单与右键单击图像相关联,当用户选择群集时,会提示用户在控制台上输入群集之间的最小距离。 显示窗口是通过调用viewer()方法创建的,该方法创建窗口并为其设置GLUT属性。 在控制台提示用户输入时,我想销毁带有加载图像的原始窗口,因为很多时候,控制台窗口会妨碍图像显示窗口 在用户在控制台输入值之后,我希望再次显示窗口。但问题是,尽管我在读取输入后调用了viewer()函数,但在下一个函数调用Clustering()完成之前,窗口不会再次出现

我有一个程序,允许用户通过对话框选择图像,并显示图像。菜单与右键单击图像相关联,当用户选择群集时,会提示用户在控制台上输入群集之间的最小距离。
显示窗口是通过调用
viewer()
方法创建的,该方法创建窗口并为其设置GLUT属性。
在控制台提示用户输入时,我想销毁带有加载图像的原始窗口,因为很多时候,控制台窗口会妨碍图像显示窗口

在用户在控制台输入值之后,我希望再次显示窗口。但问题是,尽管我在读取输入后调用了
viewer()
函数,但在下一个函数调用
Clustering()
完成之前,窗口不会再次出现。如果我没有破坏第一个窗口并将控制台窗口移走,那么在执行集群算法时,我可以看到图像的变化

我的问题是,为什么要忽略对
createWindow
的显式调用,并执行下一个命令。我尝试使用
glFinish
,但没有任何帮助:-(有人能给我一个解决方案吗

我的伪代码如下所示:

Clustering()
{
    loop
    {
        image processing code
    }
    display()  ;
}

...

display()
{
    drawing code
    glutSwapBuffers()
}

void viewer() {

   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
   glutInitWindowSize(width, height);
   glutInitWindowPosition(100, 100);

   win = glutCreateWindow("Image"); 

   glutCreateMenu(menu);
   glutAddMenuEntry("Load Image", 1);
   glutAddMenuEntry("Clustering", 3);
   glutAddMenuEntry("QUIT", 99);
   glutAttachMenu(GLUT_RIGHT_BUTTON);
   glutDisplayFunc(display);
   glutReshapeFunc(reshape);
   glutMouseFunc(mouse);
}

void menu(int id) {

glutSwapBuffers();

switch (id){
    case 1://Open image
                    ...........
        break;  

    case 3://Clustering
        glutDestroyWindow(win);
        cout << "Please enter in the minimum distance between regions - a value between 1 and " << max_distance << ": \n";
        cin >> distance;

        Viewer();
        Clustering();
        break;

    case 99:
        exit(0);
}
glutPostRedisplay();
}

main()
{
    ....
    viewer();
    glutMainLoop();
}
Clustering()
{
环
{
图像处理代码
}
显示();
}
...
显示()
{
绘图代码
glutSwapBuffers()
}
void查看器(){
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowSize(宽度、高度);
位置(100100);
win=创建窗口(“图像”);
创建菜单(菜单);
戊二醛(“加载图像”,1);
戊二醛(“聚类”,3);
戊二醛(“退出”,99);
谷胱甘肽功能表(GLUT_右键);
glutDisplayFunc(显示器);
GLUTREFORUNC(重塑);
glutMouseFunc(小鼠);
}
无效菜单(int-id){
glutSwapBuffers();
开关(id){
案例1://开放图像
...........
打破
案例3://集群
窗口(win);

cout我不认为事情按照你想象的方式进行。例如,
glutDestroyWindow
也会破坏OpenGL上下文(这是GLUT的一个限制,而不是OpenGL,它允许有一个OpenGL上下文“处于边缘”,周围没有窗口,很好)因此,如果您不断创建和销毁窗口,您还必须重新加载其间的所有图像、纹理等


说真的,如果你像你一样已经意识到了过剩的极限,那么是时候放弃过剩,使用“真正的”方法了工具箱。像Qt或wxWidgets或GTK+。

首先,
glutCreateWindow
glFinish
没有任何共同之处。其次,您使用的GLUT版本是什么?您是否考虑过使用
glutHideWindow
glutShowWindow
来临时隐藏窗口?我使用的是glut3.6。我的意思是我尝试调用了glFinish()调用createWindow()方法之前。如果我错了,请原谅,但我的理解是glFinish会强制执行所有挂起的操作,然后再继续。我当前使用的是glHideWindw和glShowWindow(),但同样,它似乎没有任何效果:-(谢谢大家!看来我必须在窗口打开的情况下生活,只需使用鼠标手动将焦点切换到窗口。我一直在使用GLUT(它是用于课堂项目,必须在学校的任何系统上运行),但感谢所有的输入!再次感谢!@msnewbie:你们学校的系统上运行的是什么操作系统?嗨,datenwolf,我学校的大多数计算机都安装了Windows 7和VisualStudio 2010。谢谢!我必须补充一点,我们获得了glut32.dll、glut.h和glut32.lib文件用于项目。自定义glut.h文件包括glu/GL.h和GL/glu.h下的glut头文件。@msnewbie:好吧,那真的不多。如果你的目标是长远的,你仍然可以直接使用Win32 API。这有点乏味,但实际上可能比被glut拖累要好。