gtk_main_quit und das programm läuft weiter
-
Aaalso ich habe eine Singleton-Klasse GameFrame die ein Gtk-Fenster öffnet. Nicht wundern, ich nutzte gtk+, nicht gtkmm. Nicht fragen..
Dieses framework wird in meinem main() instanziiert und gestartet. Nach Schließen des Fensters wird das Fenster beendet und eine statische Methode der Framework-Klasse gestartet, welche aufräumt und gtk_main_quit aufruft. So weit geht das auch glatt, allerdings ist mein programm danach noch im Speicher.. hier mal der durchstich durch meine Programmeint main(int argc, char **argv) { // initialisiere das spielframework GameFrame::init(&argc, &argv); // erstelle das framework GameFrame *frame; frame = GameFrame::getInstance(); // starte den thread frame->start(); g_print("Ende!"); // Spielinstanz entfernen GameFrame::killInstance(); return 0; }
// static GameFrame *GameFrame::getInstance() { if (instance == 0) { instance = new GameFrame(); instance->initWindow(); } return instance; } // static void GameFrame::killInstance() { if (instance != 0) { delete instance; instance = 0; } } // static void GameFrame::invokeStop() { GameFrame::getInstance()->stop(); g_print("going down..."); gtk_main_quit(); killInstance(); } /** * Starte die Animation */ void GameFrame::start() { this->timeout = gtk_timeout_add(this->timeoutperiod, GameFrame::invokeRepaintByTimer, NULL); gtk_main(); } /* *Initialisiere das Mainwindow */ void GameFrame::initWindow() { // erstelle das Hauptfenster this->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect_swapped(this->window, "destroy", G_CALLBACK( GameFrame::invokeStop), NULL); // taste gedrückt gtk_signal_connect (GTK_OBJECT(this->window), "key_press_event", GTK_SIGNAL_FUNC(GameFrame::invokeKeyPressed), NULL); // taste losgelassen gtk_signal_connect (GTK_OBJECT(this->window), "key_release_event", GTK_SIGNAL_FUNC(GameFrame::invokeKeyReleased), NULL); gtk_widget_show(this->window); // erstelle die glarea if (!initGLArea()) { g_print("could not instanciate glarea"); } // setze die screen defaults showCursor(false); setSize(640, 480); }
invokeStop() wird beim Schließen des Fensters aufgerufen, das g_print() hinter dem start() wird nie ausgegeben...
hat wer ne idee?
-
gerade hab ich nochmal drauf geschaut und mir fiel folgendes auf: wenn ich meine statische update-funktion durchlaufe, dann rufe ich start() auf um die nächste aktualisierung zu starten. da hier aber auch gtk_main() steht, hab ich mich einfach mit mainloops zugehauen. scheinbar wird beim gtk_main_quit() nur der letzte loop gestartet. die anderen sind wahrscheinlich irgendwo im datennirvana..
-
Was passiert in GameFrame::stop?