Wie Singleton-Klasse mit gtkmm-Elemente oder Klasse mit static gtkmm-Elemente



  • Hallo,
    folgendes Problem: Ich habe eine Klasse die heißt Inet die für mich die ganzen Internetsachen erledigt.

    Erst wenn sie mit ihrer Arbeit fertig ist wird die Oberfläche gestartet.
    Jetzt will ich aber das der Fortschritt von Inet in einer Progressbar angezeigt wird die vor dem Hauptprogramm startet.

    Glib::thread_init();
                Gtk::Main main_obj(argc,argv);
    
                Glib::Thread::create(sigc::mem_fun(*this,&Grafik::startInet),true); 
    
                Loader loader;
                main_obj.run(loader);
    
                UpStyleWin win;
                main_obj.run(win);
    

    Loader ist das Fenster mit der Progressbar und UpStyleWin das Hauptfenster.
    Da Inet und Loader gleichzeitig laufen müssen musste ich Inet in nem Thread starten.

    Jetzt das Problem 😃 :
    Ich muss ja von Inet aus meine Progressbar verändern.
    Um von Inet auf Loader zuzugreifen dachte ich mir ich implentiere Loader als Singleton und greife auf das Objekt von Inet zu und verändere es dann.

    Aber dann meckert der Compiler rum weil ich ja ein Objekt(obwohl ichs nicht tue) zurückgeben muss:

    static Loader& get_instance()
    {
        static Loader a;
        return a;
    }
    

    Weil ich jede Menge Copy-C'tors nicht aufrufen darf.

    Als zweite Lösung viel mir ein die Funtkion in Loader die meine Progressbar verändert static zu dekarieren, damit ich von Inet einfach draufzugreifen kann.

    Demzufolge müssen die Elemente(Progressbar,bar_status...) in Loader auf die diese Funktion zugreift auch static sein.

    Aber da meckert dann Gtkmm zur Laufzeit irgendwas von:

    initialization assertion failed use g_type_init()
    

    Wie krieg ich das Problem am besten jetzt gelöst und gibt es noch bessere Lösungsansätze ???

    EDIT:: Problem gelöst, hatte beim Singleton ein kleinen Fehler 🕶



  • 😡 😡 Grrrr 😡 😡
    Dauernd irgendwelche Runtime Errors.

    Hier wieder bissl code:

    Glib::thread_init();
                Gtk::Main main_obj(argc,argv);
    
                Glib::Thread::create(sigc::mem_fun(*this,&Grafik::startInet),true); 
    
                Loader &loader = Loader::get_instance();
                main_obj.run(loader);
    
                UpStyleWin win;
                main_obj.run(win);
    
    void Grafik::startInet()
    {
         Inet inet;
    }
    
    Loader& Loader::get_instance()
    {
            static Loader a;
            return a;
    }
    
    //Inet...
    void Inet::blaba()
    {
      ...
        Loader &loader(Loader::get_instance());
        loader.go_up(0.1);
      ...
    }
    
    void Inet::tsts()
    {
      ...
        Loader &loader(Loader::get_instance());
        loader.go_up(0.3);
      ...
    }
    
    void Inet::condog()
    {
      ...
        Loader &loader(Loader::get_instance());
        loader.go_up(0.4);
      ...
    }
    

    Ich rufe an mehreren Stellen in verschiedenen Funktionen die go_up() Funktion auf.

    Wenn ich jetzt das Programm starte kommend ein Laufzeitfehler und das Programm stürzt ab, das Schlimme dabei ist das es manchmal auch läuft und manchmal nicht.

    Ist der Singleton irgendwie ungesund für gtkmm.
    Wenn ich in Inet Loader komplett weglasse, läuft alles bestens. Halt nur das meine Ladebalken nicht lädt.

    Was mache ich falsch oder wie soll ich es am besten machen ...



  • glibmm-ERROR **: file objectbase.cc line 77 (void Glib::ObjectBase::initialize(GObject*)): assertion failed: 
    (gobject_ == castitem) aborting...
    

    Wenn ich dann auf Ok klicke kommt nochmal ne Meldung:

    "Microsoft Visual C++ Runtime Library" ... Runtime Error
    

    Und nochwas komisches ist, dass wenn ich das Programm kompiliere und es dann gestartet wird klappt es auch aber sobald ich es dann ein zweites mal starte kommt der Fehler... 😕 😕 😕 😕



  • Wie wäre es mit "Projektmappe Neuerstellen"?
    Ich denke das es da problem mit den Objects gibt 😉

    🤡



  • VC++ Guru schrieb:

    Wie wäre es mit "Projektmappe Neuerstellen"?
    Ich denke das es da problem mit den Objects gibt 😉

    🤡

    Ja das dachte ich auch erst. Aber ich kompliere jedesmal komplett ALLES NEU und daran kann der Fehler nicht liegen.



  • Keiner ne Idee wie ich das Problem lösen kann. 😞 😞

    Wie soll ich den inet starten und dem entprechend ja nach Fortschritt den Ladebalken setzten, wie macht man sowas sonst bzw. was mache ich falsch ... 🙄



  • void Inet::blabla (double d)
    {
      signal_go_up_by(d);
    }
    


  • Ich habe das Problem schon völlig anders gelöst 😃


Log in to reply