Hier habe ich zwei Schleifen. Die erste Schleife verarbeitet die Grafik für einige Sekunden und dann geht der Code in die zweite Schleife. Ich verarbeite die grafischen Ereignisse über glutMainLoopEvent
in der ersten Schleife. Bevor die zweite Schleife startet, möchte ich das Grafikfenster schließen. Es scheint, dass der Befehl glutLeaveMainLoop
das Fenster nicht schließen kann. Welche andere Funktion sollte ich verwenden, um das Fenster gleich nach der ersten Schleife zu schließen?So schließen Sie ein OpenGL-Fenster
#include <stdio.h>
#include <GL/freeglut.h>
#include <boost/thread/thread.hpp> // for sleep
void cback_render()
{
if(!glutGetWindow())
return ;
static float rotations = 0;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glRotatef(rotations, 0, 0, 1);
glBegin(GL_TRIANGLES);
glVertex3f(0,0,0);
glVertex3f(1,0,0);
glVertex3f(0,1,0);
glEnd();
glutSwapBuffers();
if (++rotations > 360) rotations -= 360;
}
void timer(int)
{
if(!glutGetWindow())
return ;
glutPostRedisplay();
glutMainLoopEvent();
glutTimerFunc(30, timer, 1);
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowPosition(100, 100);
glutInitWindowSize(512, 512);
glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS);
glutCreateWindow("freegluttest");
glutDisplayFunc (cback_render);
glutTimerFunc(30, timer, 1);
long i=0;
while(glutGetWindow() && i< 30)
{
printf("[%ld]\n",i);
i++;
glutMainLoopEvent();
boost::this_thread::sleep(boost::posix_time::milliseconds(100));
}
glutMainLoopEvent();
glutLeaveMainLoop(); // does not work
glutMainLoopEvent();
// do something else ....
while(1)
{
// other calculations
boost::this_thread::sleep(boost::posix_time::milliseconds(100));
}
return 0;
}
Ist das Glut oder Freeglut? Ich bin verwirrt mit dem Übergewicht. – CroCo
@CroCo, danke für die Erwähnung. – ar2015
Ich bin nicht vertraut mit Freeglut, aber sind Sie sicher, es ist Ok, dies "glutMainLoopEvent()" nach dem Beenden von "glutLeaveMainLoop()" zu nennen? Haben Sie auch versucht, das Fenster zu beenden, indem Sie auf die Schaltfläche x klicken? – CroCo