2017-01-02 3 views
1

Здесь у меня есть две петли. Первый цикл обрабатывает графику в течение нескольких секунд, а затем код переходит во второй цикл. Я обрабатываю графические события через glutMainLoopEvent в первом цикле. Перед началом второго цикла я хотел бы закрыть графическое окно. Кажется, команда glutLeaveMainLoop не может закрыть окно. Какую еще функцию следует использовать для принудительного закрытия окна сразу после первого цикла?Как закрыть окно openGL

#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

Является ли это избытком или свободным клеем? Я запутался с ярлыком. – CroCo

+0

@CroCo, спасибо, что упомянули об этом. – ar2015

+0

Я не знаком с freeglut, но вы уверены, что это нормально назвать «glutMainLoopEvent()» после завершения «glutLeaveMainLoop()»? Кроме того, вы пытались закрыть окно, нажав кнопку x mark? – CroCo

ответ

0

Ok от freeglut документации на http://freeglut.sourceforge.net/docs/api.php#EventProcessing

Функции используется glutLeaveMainLoop(), чтобы просто остановить главный цикл перенасыщения, если оно запускается glutMainLoop() не glutMainLoopEvent().

Поскольку вы контролируете цикл самостоятельно в своем примере, glutLeaveMainLoop() ничего не сделает.

Предназначен для того, чтобы оставить основную петлю перенасыщения, если избыточное давление контролирует это не вы.

Поскольку у вас есть while(1) в конце с 100мс сна, приложение не будет делать ничего другого, когда он попадает туда после того, как все кадры были оказаны. Если вы хотите уничтожить окно, используйте некоторую функцию окна, например glutDestroyWindow().

+0

Я думаю, что 'glutDestroyWindow()' для добавления обратного вызова. Я не думаю, что это разрушает окно. Второй цикл означает, что моя программа будет выполнять другие вычисления. Я не могу удалить второй цикл. Мне строго нужно закрыть окно без завершения программы. – ar2015

+0

Вы уверены, что вы используете версию GLUT? проверьте эту ссылку, она говорит, что функция 'glutDestroyWindow()' делает именно то, что я думаю. https://www.opengl.org/resources/libraries/glut/spec3/node19.html – Harish

+0

Извините, я допустил ошибку. Код работал с использованием: 'if (glutGetWindow()) \t \t \t glutDestroyWindow (glutGetWindow()); \t glutMainLoopEvent(); \t glutMainLoopEvent(); ' – ar2015

Смежные вопросы