2017-01-02 7 views
1

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; 
} 
+0

Ist das Glut oder Freeglut? Ich bin verwirrt mit dem Übergewicht. – CroCo

+0

@CroCo, danke für die Erwähnung. – ar2015

+0

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

Antwort

0

Ok von den freeglut docs bei http://freeglut.sourceforge.net/docs/api.php#EventProcessing

Die Funktion, die Sie verwenden glutLeaveMainLoop() ist, einfach die Hauptschleife des Schwemme zu stoppen, wenn sie von glutMainLoop() nicht glutMainLoopEvent() gestartet wird.

Da Sie in Ihrem Beispiel die Schleife selbst steuern, wird glutLeaveMainLoop() nichts tun.

Es ist beabsichtigt, die Hauptschleife der Schwemme zu verlassen, wenn die Schwemme nicht Sie kontrolliert.

Da Sie ein while(1) am Ende mit einem 100ms Schlaf haben, wird die App nichts anderes tun, wenn er dort ankommt, nachdem alle Bilder wiedergegeben wurden. Wenn Sie das Fenster zerstören wollen, benutzen Sie eine Fensterfunktion wie glutDestroyWindow().

+0

Ich denke 'glutDestroyWindow()' ist für das Hinzufügen eines Callbacks. Ich glaube nicht, dass es das Fenster zerstört. Die zweite Schleife steht für mein Programm wird eine andere Berechnungen durchführen. Ich kann die zweite Schleife nicht entfernen. Ich muss unbedingt das Fenster ohne Beendigung des Programms schließen. – ar2015

+0

Sind Sie sicher, welche Version von GLUT verwenden Sie? überprüfen Sie diesen Link es sagt die Funktion 'glutDestroyWindow()' tut genau das, was ich denke. https://www.opengl.org/resources/libraries/glut/spec3/node19.html – Harish

+0

Sorry, ich habe einen Fehler gemacht. Der Code funktioniert mit: 'if (glutGetWindow()) \t \t \t glutDestroyWindow (glutGetWindow()); \t glutMainLoopEvent(); \t glutMainLoopEvent(); ' – ar2015

Verwandte Themen