Pregunta

Realmente estoy teniendo problemas para cerrar mi aplicación de consola con FreeGLUT.

Me gustaría saber cuál es la mejor forma de hacerlo es tomar cada posible cierre, porque no quiero que ninguna de fugas de memoria (estoy bastante miedo de esos).

Así que ya lo he intentado de la siguiente, que me está dando una excepción como esta:

Excepción de primera oportunidad en 0x754e6a6f en myProject.exe:0x40010005:Control-C.

int main(int argc, char **argv)
{
    if( SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, true) )
    {
        // more code here as well ....


        glutCloseFunc(close); // set the window closing function of opengl
        glutMainLoop();
        close(); // close function if coming here somehow
    }
    else
    {
        return 1;
    }
    return 0;
}

void close()
{
    // keyboardManager is a pointer to a class
    // which I want to delete, so no memory will leak.
    if(keyboardManager) // do I need this check?
        delete keyboardManager;
}

bool CtrlHandler(DWORD fdwCtrlType)
{
    switch(fdwCtrlType)
    {
        // Handle the CTRL-C signal.
        case CTRL_C_EVENT:
        // and the close button
        case CTRL_CLOSE_EVENT:
          close();
          return true;

        // Pass other signals to the next handler. 
        case CTRL_BREAK_EVENT:
            return false;

    // delete the pointer anyway
        case CTRL_LOGOFF_EVENT:
        case CTRL_SHUTDOWN_EVENT:
        default:
            close();
            return false; 
    } 
}

Entonces, ¿qué va a la derecha es:

  1. Cierre la ventana de glut
  2. El cierre de la aplicación de consola con el x
  3. El cierre de mi ventana de la sobresaturación con mi keyboardmanager if(keyboardManager->isKeyDown[27]) glutExit();

Lo que va mal es:

  1. El cierre de la aplicación de consola con CTRL+C, se da la excepción de arriba.

Esto es en Visual Studio 2008 C++.

ACTUALIZACIÓN

Me encontré con que se produce la excepción, porque estoy en la depuración.Así que no será un problema.Pero la pregunta sigue abierta: ¿Cuál es la forma más elegante para cerrar exceso?

atexit() parece funcionar igual de bien, así que tal vez puedo usar esto?

¿Fue útil?

Solución

Yo uso esta función:

void glutLeaveMainLoop ( void ); 

Hay más información en su página de sourceforge, pero yo nunca he usado esa funcionalidad:

El glutLeaveMainLoop función causas freeglut para detener el bucle de eventos.Si el GLUT_ACTION_ON_WINDOW_CLOSE la opción que se ha establecido para GLUT_ACTION_CONTINUE_EXECUTION, el control volverá a la función que llama glutMainLoop;de lo contrario, la aplicación se cerrará.

http://freeglut.sourceforge.net/docs/api.php#EventProcessing

Es seguro de usar delete en un puntero nulo, sin necesidad de verificación.

Otros consejos

Gracias a Martín del post, esto funciona para mí:

glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,GLUT_ACTION_CONTINUE_EXECUTION);

siempre que desea dejar el mainloop sin termiante el uso de la aplicación:

glutLeaveMainLoop();

no olvides incluir "freeglut.h"

Yo uso glutDestroyWindow(int handle);

o

De acuerdo a la CLAVE:RigidBody en OpenGL foro

void destroy_window() 
{
 window_valid = -1;
}

void display_func() 
{
 if(window_valid == -1)
   return;
 // draw things
}

Pruebe este método:

glutDestroyWindow(glutGetWindow());
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top