PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : GLUT: glutMainLoop verlassen ohne Programm zu beenden?


Vedek Bareil
2004-11-20, 21:16:58
Hallo,

ich habe folgendes Problem: ich will in unter Verwendung von GLUT ein Programm schreiben, das nach Beenden des glutMainLoop noch was anderes macht (z.B. mittlere Framerate oder Gesamtzahl der gerenderten Polygone ausgeben oder so), also etwa so:
int main(/*...*/)
{
//...

// Enter GLUT Main Loop:
glutMainLoop();

/* anschließende Aktionen */

return 0;
}

Die Frage ist, wie kann ich den Main Loop so verlassen, daß die weiteren Aktionen immer noch durchführbar sind? Bisher hab ich das immer so gemacht, daß ich in der Handler-Funktion für Tastatur-Events als Reaktion auf das Drücken z.B. der Escape-Taste das Kommando exit(0) festgelegt habe:

glutKeyboardFunc(keyboard);

//...

void keyboard(unsigned char key, int x, int y)
{
switch(key)
{
//...

case 0x1B: // Esc gedrückt
exit(0);
}
}

Das Problem ist, daß dadurch mit dem GLUT Main Loop auch immer gleich das Programm selbst beendet wird, also die weiteren Aktionen nicht mehr ausgeführt werden.
Was kann man statt exit(0) verwenden, daß nur der Main Loop und nicht das Programm verlassen wird? Gibt's da vielleicht ne Funktion glutQuitMainLoop oder so?

Xero
2004-11-20, 21:56:44
wie wäre es mit


GLUTAPI void APIENTRY __glutInitWithExit(int *argcp, char **argv, void (__cdecl *exitfunc)(int));


? da kannste afaik eine funktion angeben die dann vor dem beenden aufgerufen wird...

für exit gibts das ganze afaik auch nochmal mit atexit()

Vedek Bareil
2004-11-21, 00:36:55
Mit __glutInitWithExit scheint's nicht zu klappen. Jedenfalls nicht, wenn auf Esc mit exit(0) reagiert wird, und wenn ich stattdessen atexit(0) nehme, passiert überhaupt nichts, dann läuft der GLUT Main Loop einfach weiter.


void exitLoop(int x)
{
MessageBox(NULL, "Exiting GLUT Main Loop", "Exiting", MB_OK);
// Diese Message-Box erscheint nicht!
}

void keyboard(unsigned char key, int x, int y)
{
switch(key)
{
//...

case 0x1B: // Esc gedrückt
exit(0);
}
}


int main(/*...*/)
{
__glutInitWithExit(/*...*/, exitLoop);
glutKeyboardFunc(keyboard);

//...
}

Gnafoo
2004-11-21, 01:26:29
Afaik geht das beim ganz normalen GLUT nicht.

Der erste Google-Link sagt folgendes:
"Old GLUT [...] would only exit glutMainLoop() if the user closed one of your windows or if you called exit(). In no case would old GLUT return control to your code by simply returning from glutMainLoop()."

Das kommt von der OpenGLUT API-Dokumentation (http://openglut.sourceforge.net/group__mainloop.html).

Die erweitern/verbessern das normale GLUT. Habe es selbst noch nie benutzt, aber vielleicht ist es ja für deine Ansprüche besser geeignet.
Von daher solltest du es vielleicht einfach mal ausprobieren: http://openglut.sourceforge.net/

Viel Erfolg :)
cu DerTod

Vedek Bareil
2004-11-21, 01:50:35
jo danke, versuch ich mal :)

Vedek Bareil
2004-11-21, 02:21:44
nur ist dann mal wieder das übliche Library-Lotto angesagt: welche Kombination von eingebundenen Bibliotheken löst die Gleichung

N_UndefinedReferenceMeldungen = 0?

-lopenglut -lglu32 -lopengl32 -lwinmm -lgdi32 -lglut -lglut32 ist's nicht.

ethrandil
2004-11-21, 13:36:12
EDIT: ist natürlich unfug, wenns mit dem GLUT-API so nicht geht...

Öhhm, ihr wollt den mainloop verlassen, danach noch was ausführen und macht das mit exit(0)?!?
wie wärs denn mit:

running = true;
do{
/* krams */
switch(keyevent){
/* blabla */
case EXIT:
running = false;
break;
}
}while(running);
/* Alles nach dem Loop */
exit(0);

peecee
2004-11-21, 18:49:54
Oder du schreibst einfach eine Funktion

void exitGLUTMainLoop(int exitcode) {

/*Sachen machen die du willst*/
exit(exitcode);
}

Vedek Bareil
2004-11-21, 23:57:35
ethrandil's Vorschlag hat mich drauf gebracht:
bool isRunning = TRUE; /* global deklariert, anders geht's nicht */

//...

void afterWorkParty()
{
glutDestroyWindow(1);
/* anschließende Aktionen */
exit(0);
}

void keyboard(unsigned char key, /*...*/)
{
switch (key)
{
case 0x1B: // Esc
isRunning = FALSE;
}
}

void display()
{
if (isRunning)
{
/* übliche Rendering-Aktionen */
}

else afterWorkParty();
}

int main(/*...*/)
{
//...

glutKeyboardFunc(keyboard);
glutDisplayFunc(display);

//...

glutMainLoop();
}