¿Cuál es la mejor manera de cerrar FreeGLUT?
-
14-11-2019 - |
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:
- Cierre la ventana de glut
- El cierre de la aplicación de consola con el
x
- El cierre de mi ventana de la sobresaturación con mi keyboardmanager
if(keyboardManager->isKeyDown[27]) glutExit();
Lo que va mal es:
- 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?
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());