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 Programme

    int 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?


Anmelden zum Antworten