Какой самый лучший способ закрыть FreeGLUT? - PullRequest
11 голосов
/ 17 февраля 2011

У меня действительно проблемы с закрытием консольного приложения с помощью FreeGLUT.

Я хотел бы знать, как лучше всего делать все возможное закрытие, потому что я не хочу никаких утечек памяти (я их очень боюсь).

Итак, я уже попробовал следующее, что дает мне исключение, подобное этому:

Исключение первого шанса в 0x754e6a6f в 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; 
    } 
}

Итак, что идет правильно:

  1. Закрытие окна перенасыщения
  2. Закрытие консольного приложения с помощью x
  3. Закрытие моего окна перенасыщения с помощью моего клавишного менеджера if(keyboardManager->isKeyDown[27]) glutExit();

Что идет не так:

  1. Закрытие консольного приложения с помощью комбинации клавиш CTRL + C дает исключение сверху.

Это в Visual Studio 2008 C ++.

UPDATE

Я обнаружил, что исключение выдается, потому что я нахожусь в отладке. Так что это не будет проблемой. Но вопрос все еще открыт: Какой самый элегантный способ на самом деле закрыть перенасыщение?

atexit(), кажется, тоже работает, так что, может быть, я могу использовать это?

Ответы [ 4 ]

13 голосов
/ 21 февраля 2011

Я использую эту функцию:

void glutLeaveMainLoop ( void ); 

На их странице sourceforge есть дополнительная информация, но я никогда не использовал эту функциональность:

Функция glutLeaveMainLoop заставляет freeglut останавливать цикл обработки событий. Если для параметра GLUT_ACTION_ON_WINDOW_CLOSE было установлено значение GLUT_ACTION_CONTINUE_EXECUTION, элемент управления вернется к функции, вызвавшей glutMainLoop; в противном случае приложение будет закрыто.

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

Безопасно использовать delete для нулевого указателя, проверять не нужно.

5 голосов
/ 29 сентября 2016

Благодаря посту Мартена, это работает для меня:

glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,GLUT_ACTION_CONTINUE_EXECUTION);

всякий раз, когда вы хотите оставить mainloop без termiante, использование приложения:

glutLeaveMainLoop();

не забудьте включить"freeglut.h"

1 голос
/ 06 июля 2016

Я использую glutDestroyWindow(int handle);

или

Согласно ID: RigidBody на форуме OpenGL

void destroy_window() 
{
 window_valid = -1;
}

void display_func() 
{
 if(window_valid == -1)
   return;
 // draw things
}
0 голосов
/ 01 октября 2018

Попробуйте этот метод:

glutDestroyWindow(glutGetWindow());
...