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 é:

  1. O fechamento da janela de excesso de
  2. Fechar o aplicativo de console com o x
  3. Fechar a minha janela do excesso com a minha keyboardmanager if(keyboardManager->isKeyDown[27]) glutExit();

O que acontece de errado é:

  1. 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?

Foi útil?

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());
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top