Qual é a forma mais agradável para fechar FreeGLUT?
-
14-11-2019 - |
Pergunta
Eu realmente estou tendo problemas de fechamento do meu aplicativo de console com FreeGLUT.
Gostaria de saber qual a melhor maneira é tomar cada um possível fechamento, porque eu não quero qualquer vazamento de memória (eu tenho muito medo dessas).
Então, eu já tentei o seguinte, que está me dando uma exceção como essa:
Exceção de primeira chance no 0x754e6a6f em 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;
}
}
Então, o que vai para a direita é:
- O fechamento da janela de excesso de
- Fechar o aplicativo de console com o
x
- Fechar a minha janela do excesso com a minha keyboardmanager
if(keyboardManager->isKeyDown[27]) glutExit();
O que acontece de errado é:
- Fechar o aplicativo de console com CTRL+C, dá a exceção de cima.
Isso é no Visual Studio 2008, C++.
ATUALIZAÇÃO
Eu achei que a exceção é lançada, porque eu estou na depuração.Por isso que não vai ser um problema.Mas a questão ainda está em aberto: Qual é a forma mais elegante para fechar, na verdade, excesso?
atexit()
parece funcionar bem, então talvez eu possa usar isso?
Solução
Eu uso essa função:
void glutLeaveMainLoop ( void );
Não há mais informações sobre sua página do sourceforge, mas eu nunca usei essa funcionalidade:
O glutLeaveMainLoop função faz com que freeglut para parar o loop de eventos.Se o GLUT_ACTION_ON_WINDOW_CLOSE opção foi definida para GLUT_ACTION_CONTINUE_EXECUTION, o controle retornará para a função que chamou glutMainLoop;caso contrário, o aplicativo será encerrado.
http://freeglut.sourceforge.net/docs/api.php#EventProcessing
É seguro usar delete
em um ponteiro nulo, não há necessidade de verificação.
Outras dicas
Graças a Maarten post, isso funciona para mim:
glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,GLUT_ACTION_CONTINUE_EXECUTION);
sempre que você quiser para deixar o mainloop sem termiante o uso do aplicativo:
glutLeaveMainLoop();
não esqueça de incluir o "freeglut.h"
Eu uso glutDestroyWindow(int handle);
ou
De acordo com a IDENTIFICAÇÃO de:RigidBody em OpenGL fórum
void destroy_window()
{
window_valid = -1;
}
void display_func()
{
if(window_valid == -1)
return;
// draw things
}
Tente este método:
glutDestroyWindow(glutGetWindow());