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). P>
Donc j'ai déjà essayé ce qui suit, ce qui me donne une exception comme celle-ci: P>
Exception de première chance à 0x754e6A6F dans myProject.exe: 0x40010005: Control-c. P> blockQuote>
xxx pré> donc ce qui va juste est: p>
- Fermeture de la fenêtre de GLUT LI>
- Fermeture de l'application de la console avec le
x code> li>
- Fermer ma fenêtre de glutte avec mon keyboardManager
si (KeyboardManager-> iskeydown [27]) Glutexit (); Code> Li> ol>
Qu'est-ce qui ne va pas, c'est: P>
- Fermeture de l'application de la console avec Ctrl + C, il donne l'exception d'en haut. Li> ol>
Ceci est dans Visual Studio 2008 C ++. P>
mise à jour em> p>
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? Em> p>
atexit () code> semble fonctionner aussi bien, alors peut-être Je peux utiliser ceci? P> P>
4 Réponses :
J'utilise cette fonction: Il y a plus d'informations sur leur page Sourceforge, mais je n'ai jamais utilisé cette fonctionnalité: P> 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. p>
blockQuote> http://freeglut.sourceforge.net/docs/api. PHP # EventProcessing P> Il est prudent d'utiliser
Supprimer code> sur un pointeur NULL, pas besoin de vérifier. p> p>
Semble vraiment intéressant. Je pourrais donc appeler cette fonction dans le setConsolectrlhandler code> et dans le keyChecker pour vérifier
ESC code>. 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 () code> n'existe plus. Alors maintenant, quelle serait la réponse à la question de l'OP?
Glutleavemainloop Code> 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 code> Il inclut simplement
freeglut_std.h code>. Vous devez inclure
gl / freeglut.h code> à la place, et qui inclut à la fois les en-têtes _STD et
freeGLUT_EXT.H CODE>, puis vous obtenez
Glutleavemainloop () Code >.
J'utilise ou p> selon ID: Rigidebody sur OpenGL Forum P> GlutDestroywindow (Poignée Int); code>
void destroy_window()
{
window_valid = -1;
}
void display_func()
{
if(window_valid == -1)
return;
// draw things
}
Merci à MAArten's Post, cela m'efforce: Chaque fois que vous souhaitez laisser le Mainloop sans terminer l'application Utilisez: P> glutLeaveMainLoop();
Essayez cette méthode:
glutDestroyWindow(glutGetWindow());
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 () code> 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.