Fenster verstecken oder neu erstellen?



  • Hallo,

    ich hab mal eine Frage. Und zwar hab ich in meiner Anwendung mehrere verschiedene Fenster wie etwa einen Optionen-Dialog, in dem Benutzer diverse Einstellungen vornehmen können.

    Die Frage ist jetzt, wie soll man am besten verfahren wenn der Benutzer das Fenster nachdem er seine Optionen eingestellt hat, das Fenster wieder schließt? Sollte man es unsichtbar machen und beim nächsten öffnen einfach wieder sichtbar? Oder sollte man es per DestroyWindow in WM_CLOSE zurstören und bei jedem öffnen wieder neu erstellen?

    Ich vermute halt dass wenn man das Fenster einfach nur unsichtbar macht, dass es dann immer noch Resourcen verbraucht und das daher die langsamere Variante wäre? Vor allem wenn man relativ viele solcher "Unterfenster" hat...

    Andererseits habe ich bereits jetzt Performance Probleme bei einem Fenster, welches eine sehr lange List-View beinhaltet. Momentan befülle ich diese Listbox beim Erstellen ungefähr so:

    for (std::vector<std::string>::iterator i = list.begin(), e = list.end(); i != e; ++i) {
        char c = (*i)[(*i).size() - 1];
    
        // Nur strings mit diesen Zahlen am Ende einfügen
        if (c == 5 || c == 6 || c == 7) {
            // Die Zahl dann abschneiden
            std::string s = (*i).substr(0, (*i).size() - 1);
    
            // ... benutze dann hier ListView_InsertItem um s hinzuzufügen
        }
    }
    

    Dies führt aber zu einem spürbaren Lag wenn das Fenster geöffnet wird (es handlet sich um mehrere tausende Einträge).

    Wie würde man hier generell am besten vorgehen?



  • Ich würde das Fenster schliessen und neu öffnen. Damit bekommt man nach meiner Erfahrung weniger Probleme. Also nicht dass es ein grundsätzliches Problem mit dem Verstecken/wieder Anzeigen gibt. Nur man baut selbst weniger Mist.

    (Ich mache das allgemein so, nicht nur bei GUI. Es soll ja viele Programmierer geben die lieber Objekte "wiederverwenden" anstatt sie zu löschen und neue zu erzeugen. Optimierungswahn und so. Ich mach das umgekehrt: ich lösche lieber das alte Objekt, und mach wenn ich ein neues brauch eben ein neues. Ausgenommen natürlich Fälle wo die Objekte eine "Identität" haben, die nicht verlorengehen darf -- wie z.B. wenn Event-Listener drauf verbunden sind. D.h. ich lösche nicht einen Button, und erzeuge dann einen neuen, nur weil ich den Text auf dem Button ändern will ;))

    Und was List Views mit viel Inhalt angeht würde ich ne virtuelle List View vorschlagen:
    http://msdn.microsoft.com/en-us/library/windows/desktop/bb774735(v=vs.85).aspx#Creating_a_virtual_listview_control

    Da kannst du dann auch zig- oder hunderttausend Zeilen drin haben ohne dass es ernsthaft laggt. Vorausgesetzt natürlich du hast bereits eine "Datenquelle" (Container, Datenbank - was auch immer) aus der du die Items performant über ihren Index rausholen kannst.

    Ansonsten...
    Ist der Dialog sichtbar während du die List View befüllst? Wenn ja, dann versuch mal den Dialog erst nach dem Befüllen anzuzeigen.



  • Ok, das klingt alles sehr vielversprechend, vor allem mit den virtuellen ListViews. Werd ich gleich mal ausprobieren!

    hustbaer schrieb:

    Ansonsten...
    Ist der Dialog sichtbar während die die List View befüllst? Wenn ja, dann versuch mal den Dialog erst nach dem Befüllen anzuzeigen.

    Das kann sein, hab ich noch gar nicht dran gedacht... werd ich auch gleich mal checken, vielleicht frisst das ja soviel Leistung.

    Danke für die Tipps 👍


Log in to reply