[C#/Mono] Gtk.Treeview sneller maken

Pagina: 1
Acties:

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 18:37

Gerco

Professional Newbie

Topicstarter
Ik ben een applicatie aan het maken met Mono, c#, Gtk# en db4o. In die applicatie heb ik een aantal schermen waar ik wat gegevens in wil laten zien en aangezien data binding in Gtk# (nog) niet beschikbaar is doe ik dat met een Gtk.Treeview (die een soort kruising is van Treeview en Listview in de Windows wereld).

Hiervoor heb ik een TreeModel gebruikt die standaard bij Gtk# geleverd zit, namelijk de ListStore. Dit liststore vul ik op de volgende manier (in een subclass ervan):
C#:
1
2
3
4
5
6
7
    public void fillWith(IList list) {
        Clear();
        
        foreach(Klant k in list) {
            AppendValues(k);
        }
    }


Die list is een db4o ObjectSet, het resultaat van een query. Daar gaat het me niet om, die is snel zat. Waar het wel om gaat is dat het vullen van die ListStore veel te lang duurt, ruim een seconde voor ongeveer 600 items op een 1.5GHz Pentium-M met 512MB RAM.

Nu is het niet zo erg dat het lang duurt als het maar 1 keer zou moeten gebeuren, maar ik heb een filter textbox op dat window staan en bij elke aanslag in die textbox voer ik de query opnieuw uit en display ik het resultaat. Bij het leegmaken van de textbox (door backspace te gebruiken), zorgt dit voor zeer irritante vertragingen in de lijstopbouw en dat vind ik niet werkbaar.

Heeft iemand een idee over hoe ik dit beter kan doen? Het filteren is op zich geen requirement, maar het moet mogelijk zijn om snel iets in de lijst te vinden, waarbij er over meerdere kolommen tegelijk gezocht moet worden.

In het Win32 programma wat dit programma moet vervangen gebruik ik een virtual listview, waarbij de Listview een callback doet voor hij elk item gaat renderen. Op die manier kan ik miljoenen items in een fractie van een seconde "laden". Eigenlijk zoek ik zoiets, maar dat heb ik in Gtk# nog niet gevonden.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:05
Ik heb geen ervaring met mono, maar, wat wel eens wil helpen om sneller items aan een listview toe te voegen, is gebruik te maken van de Beginupdate/EndUpdate() methods en van de AddRange method.
Met die laatste ga je alle items in één keer toevoegen, ipv voor ieder item apart de add aan te roepen.

https://fgheysels.github.io/


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 18:37

Gerco

Professional Newbie

Topicstarter
BeginUpdate(), EndUpdate() en AddRange() zijn helaas geen methods van de Gtk Treeview / ListStore. Ik vermoed dat die van de Windows.Forms.Treeview afkomstig zijn. Daar heb ik niet zoveel aan aangezien ik het programma op Linux wil draaien :)

Ik heb geprobeerd om de TreeModel tijdelijk los te koppelen van de TreeView, zodat hij niet steeds de lijst opnieuw gaat renderen en dat helpt wel een klein beetje, maar het loopt nog steeds te langzaam. Voor 600 items is het nu wel te doen, maar ik wil in een aantal lijsten enkele duizenden items inladen en daarvoor is het nog steeds veel te traag.

Eigenlijk zoek ik een manier om dat kopieren helemaal achterwege te laten en een ObjectSetStore (oid) te implementeren, maar van alles wat ik op Google kan vinden wordt ik wijzer dat dat in managed code nog niet mogelijk is :(

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 18:37

Gerco

Professional Newbie

Topicstarter
Even een schaamteloze kick, misschien dat er vandaag iemand rondloopt die eerder met dit bijltje gehakt heeft.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • bimm
  • Registratie: November 2005
  • Laatst online: 08-03 22:16
Ik wou dat ik het wist. Ik word uberhaubt helemaal gek van MonoDevelop. Crashed om de zoveel seconde als ik er iets mee wil. Documentatie is ver te zoeken en als ik het MonoDoc programma gebruik zit er niet eens zoekmogelijkheden in.

Lekker. Wou je graag helpen en nog liever naar documentatie of voorbeelden verwijzen maar....

Ik ook, jij niet?


  • GarBaGe
  • Registratie: December 1999
  • Laatst online: 13-04 21:01
Wordt voor iedere toetsaanslag ook die query opnieuwuitgevoerd ??
Queries zijn vaak wel snel, maar de overhead van een query is vaak (relatief) gigantisch. Bovendien wil je per toetsaanslag ook geen query uitvoeren...
(ik verdenk de query eerder van performance problemen, dan de List)...

En als de List inderdaad het grote probleem is, kan je nog de List opbouwen in een andere thread doen...

Ryzen9 5900X; 16GB DDR4-3200 ; RTX-4080S ; 7TB SSD


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 18:37

Gerco

Professional Newbie

Topicstarter
GarBaGe schreef op maandag 23 januari 2006 @ 14:15:
Wordt voor iedere toetsaanslag ook die query opnieuwuitgevoerd ??
Queries zijn vaak wel snel, maar de overhead van een query is vaak (relatief) gigantisch. Bovendien wil je per toetsaanslag ook geen query uitvoeren...
(ik verdenk de query eerder van performance problemen, dan de List)...
Ik heb het gemeten en de query komt ruim binnen 100ms terug (het is een lokale, file-based database, geen netwerk overhead dus), die lijkt me het probleem niet.
En als de List inderdaad het grote probleem is, kan je nog de List opbouwen in een andere thread doen...
Dat heb ik geprobeerd, maar dan raakt Gtk helemaal van slag. Je mag Gtk alleen aanspreken binnen de Gui thread. Zelfs als het model tijdelijk ontkoppeld is van de Tree raakt hij van slag. Het Model gebruikt blijkbaar wat Gtk internals waardoor ik dat alleen vanuit de Gui thread kan/mag gebruiken.

Ik wilde een System.Timer gebruiken om een seconde te wachten na de laatste keypress, maar die start ook weer zijn eigen thread en daar kan ik dan weer weinig mee.

@bimm: Overigens is MonoDevelop 0.9 hier nog nooit gecrashed, terwijl ik er toch uren achtereen mee zit te werken. Misschien moet je het even opnieuw downloaden?

[ Voor 10% gewijzigd door Gerco op 23-01-2006 14:22 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • bimm
  • Registratie: November 2005
  • Laatst online: 08-03 22:16
Ik moet toegeven dat ik 0.9 nog niet heb geprobeerd, maar ik zit wel ingeschreven op de monodoc mail lijst en zie nog steeds allerlei enge dingen voorbij komen die naar mijn inzicht helemaal niet mogen voorkomen. Zeker niet bij een documentatie programma(tje).

Ik zal het weer eens proberen.

Ik ook, jij niet?

Pagina: 1