11
votes

Quelle est la meilleure façon de fermer Freeglut?

J'ai vraiment du mal à fermer ma demande de console avec Freeglut.

J'aimerais savoir ce que le meilleur moyen est de prendre toutes les clôtures possibles, car je ne veux pas de fuites de mémoire (j'ai plutôt peur de ceux).

Donc j'ai déjà essayé ce qui suit, ce qui me donne une exception comme celle-ci:

Exception de première chance à 0x754e6A6F dans myProject.exe: 0x40010005: Control-c. xxx

donc ce qui va juste est:

  1. Fermeture de la fenêtre de GLUT
  2. Fermeture de l'application de la console avec le x
  3. Fermer ma fenêtre de glutte avec mon keyboardManager si (KeyboardManager-> iskeydown [27]) Glutexit ();

    Qu'est-ce qui ne va pas, c'est:

    1. Fermeture de l'application de la console avec Ctrl + C, il donne l'exception d'en haut.

      Ceci est dans Visual Studio 2008 C ++.

      mise à jour

      J'ai trouvé que l'exception est jetée, parce que je suis dans déboguer. Donc, ce ne sera pas un problème. Mais la question est toujours ouverte: quelle est la manière la plus élégante de fermer la glutte?

      atexit () semble fonctionner aussi bien, alors peut-être Je peux utiliser ceci?


5 commentaires

Vous n'avez pas besoin de vous inquiéter de libérer la mémoire lorsque votre programme s'arrête, le système d'exploitation récupère tout et rien ne fuit. Les ressources persistantes comme les fichiers doivent toujours être nettoyées correctement bien sûr.


atexit () ne résoudra probablement pas votre problème de nettoyage des objets C ++.


@Ben, @wilhelmtell: Mais je devrais effacer mon objet KeyboardManager, par exemple, parce que mon PROGAM tient un pointeur dessus, non?


S'il utilise certaines ressources qui survivent à la fin de votre programme, oui. Mais le système d'exploitation récupérera la mémoire et devrait également révoquer la capture d'entrée du clavier. Un gestionnaire de clavier n'a donc probablement pas besoin de nettoyage. Il y a même une école de pensée qui dit de ne pas nettoyer les ressources persistantes non plus, la justification étant que votre nettoyage n'aura que la chance de courir (une panne de courant catastrophique peut-être), de sorte que vous avez besoin de logique pour récupérer l'état sale. Et si vous pouvez traiter avec Sale State, tout nettoyage est juste une perte de temps.


Si vous vous souciez de fuites OpenGL (disons que vous recréez des objets ou que vous démarrez et déchirez OpenGL plus d'une fois), vous pouvez utiliser Gdebugger pour signaler tous les objets OpenGL fuite. Il signale également toutes sortes de choses utiles que vous pourrez vous faire de manière incorrecte, comme des changements d'état redondants, ou d'utiliser des fonctionnalités obsolètes.


4 Réponses :


15
votes

J'utilise cette fonction: xxx

Il y a plus d'informations sur leur page Sourceforge, mais je n'ai jamais utilisé cette fonctionnalité:

La fonction GLUTLEAVEMAINOOPLOOP fait que Freeglut arrête la boucle d'événement. Si l'option Glut_Action_ON_Window_Close a été définie sur GLUT_ACT_CONTINUEE_EXECUTION, le contrôle reviendra à la fonction appelée Glutmainloop; Sinon, l'application quitte.

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

Il est prudent d'utiliser Supprimer sur un pointeur NULL, pas besoin de vérifier.


6 commentaires

Semble vraiment intéressant. Je pourrais donc appeler cette fonction dans le setConsolectrlhandler et dans le keyChecker pour vérifier ESC . Donc, je pourrais alors mettre mon pointeur Supprimer dans la fonction principale probablement?


Il est de loin préférable de configurer GlutClosefunc pour appeler une fonction qui se nettoie. Freeglut l'appellera avant qu'il ne tente de démolir le contexte, contrairement à le faire après le menillon principal.


Ce n'est vraiment pas un gros problème de nettoyer correctement, mais si vous utilisez un outil tel que GdeBugger qui se plaint si vous ne nettoyez pas, vous pouvez utiliser GlutClosefunc pour obtenir des courses propres.


Ok donc selon la dernière spécification de gibier (3.7), glutleavemainloop () n'existe plus. Alors maintenant, quelle serait la réponse à la question de l'OP?


Glutleavemainloop existe toujours dans Freeglut (et je crois que OpenGlut, bien que non vérifié, mais leur échantillon de subwin l'utilise). Testé avec la dernière version stable, 3.0.0 - Il s'agit d'une extension de la colonne régulière.


Ubuntu l'a mais il y a un tour. Glut sur Ubuntu est tout Freeglut et le Freeglut est divisé en fichiers d'en-tête _std et _ext. Si vous incluez GL / GLUT.H Il inclut simplement freeglut_std.h . Vous devez inclure gl / freeglut.h à la place, et qui inclut à la fois les en-têtes _STD et freeGLUT_EXT.H , puis vous obtenez Glutleavemainloop () .



1
votes

J'utilise GlutDestroywindow (Poignée Int); code>

ou p>

selon ID: Rigidebody sur OpenGL Forum P>

void destroy_window() 
{
 window_valid = -1;
}

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


0 commentaires

5
votes

Merci à MAArten's Post, cela m'efforce: XXX PRE>

Chaque fois que vous souhaitez laisser le Mainloop sans terminer l'application Utilisez: P>

glutLeaveMainLoop();


0 commentaires

0
votes

Essayez cette méthode:

glutDestroyWindow(glutGetWindow());


0 commentaires