Toon posts:

[C#] Thread die UI update

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
hallo,

ik heb volgende regel code die een method oproept die een Listview update via een thread


C#:
1
this.Dispatcher.BeginInvoke(DispatcherPriority.Render, (ThreadStart)delegate { dodo(); });


C#:
1
2
3
4
private void dodo()
        {
            view.getDirectoriesTreeSource((TreeViewItem)e.Source);
        }


het probleem is nu dat het wel werkt, maar ik zou graag hebben dat ieder geladen item getoond wordt in de Listview van zodra het geladen is. nu wordt eerst alle info geladen en wordt de UI pas geupdated van zodra alles geladen is. dat geeft natuurlijk dat als er 1000 items te laden zijn dat de UI niet lijkt te reageren, terwijl er mogelijk al 500 items geladen zijn.


bedankt voor de hulp

Acties:
  • 0 Henk 'm!

  • Razr
  • Registratie: September 2005
  • Niet online
Dan moet je dus niet in je UI thread de items laden. En pas als ze allemaal geladen zijn update je de ListView via de Dispatcher en geef je als argument een collectie mee met de items o.i.d.?

Acties:
  • 0 Henk 'm!

  • Fiander
  • Registratie: Februari 2001
  • Laatst online: 28-05 12:35
Zo op het eerste gezicht ben je een treeview aan het vullen ?

Moeten alle child items ook meteen geladen worden, of zou dat stiekum niet op de achtergrond als tweede gedaan kunnen worden.

dus eerst de parent items en deze meteen tonen. En dan op de achtergrond de child items erbij zetten.
of wat meestal gebeurt, de child items pas laden waneer ze nodig zijn. dus bij het parent.onopen event ( ofzo )

Deze sig is een manueel virus!! Als je dit leest heb je het. Mail dit bericht naar iedereen die je kent, en verwijder alle bestanden van je computer.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik ben via de expand event van een treeview een listview aan het vullen met alle subdirectories en files wat onder die treeview staan.

Acties:
  • 0 Henk 'm!

  • Fiander
  • Registratie: Februari 2001
  • Laatst online: 28-05 12:35
Het laden van de folders, doe je dat helemaal recursief ? dus meteen alle subfolders en daar de subs ook van ?

of ben je gewoon bang dat je een folder van meer dan 1000 items tegen komt ?

Deze sig is een manueel virus!! Als je dit leest heb je het. Mail dit bericht naar iedereen die je kent, en verwijder alle bestanden van je computer.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik laad enkel de subfolders en alle files onder de ge-expande folder. en die aantal files kunnen er inderdaad makkelijk 1000 zijn.

Acties:
  • 0 Henk 'm!

  • Fiander
  • Registratie: Februari 2001
  • Laatst online: 28-05 12:35
Dan zou je doormiddel van een soort callback event, na 50 items, een tijdelijke lijst retour kunnen sturen. meer passen er toch niet op het scherm. op de achtergrond word dan de rest gevult.

verder is er weinig wat er gedaan kan worden. mischien dat je zelfs om de 50 items een callback zou kunnen geven.

Verder wel vreemt dat slechts 1000 items al voor soon vertraging zorgen? is er niet iets wat de boel ophoud ? met GetFolders en GetFiles krijg je toch erg snel terug wat je nodig hebt lijkt mij ?

Deze sig is een manueel virus!! Als je dit leest heb je het. Mail dit bericht naar iedereen die je kent, en verwijder alle bestanden van je computer.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Fiander schreef op dinsdag 21 april 2009 @ 10:42:
Dan zou je doormiddel van een soort callback event, na 50 items, een tijdelijke lijst retour kunnen sturen. meer passen er toch niet op het scherm. op de achtergrond word dan de rest gevult.

verder is er weinig wat er gedaan kan worden. mischien dat je zelfs om de 50 items een callback zou kunnen geven.

Verder wel vreemt dat slechts 1000 items al voor soon vertraging zorgen? is er niet iets wat de boel ophoud ? met GetFolders en GetFiles krijg je toch erg snel terug wat je nodig hebt lijkt mij ?
bedankt voor de info...

het klopt idd dat 1000 normale items niet veel problemen oplevert, maar ik werk met files die coordinaten bevatten. en van iedere file wordt op basis van die coordinaten een grafiek als preview getekend die in de listview getoond moet worden. en dat kan voor slecht 20 bestanden al snel 5 seconden duren als iedere file +-500 coordinaten bevat.

Acties:
  • 0 Henk 'm!

  • Fiander
  • Registratie: Februari 2001
  • Laatst online: 28-05 12:35
Dus wat je eigenlijks wilt, is dat na het opbouwen van de treeview, er item voor item een thumbnail in een ander scherm getoont word ?

iets als de verkenner welke op thumbnailview staat ?

Dan zit er weinig meer op dan de Thread een event laten vuren elke keer dat er een item klaar is, en je main thread ( de UI ) naar dat event laten luisteren. Je kun een event maken welke een plaatje als extra object heeft, en bij het vuren van het event dat object vullen. Bij het afhandelen van het event kun je je plaatje dan in e vinden.

Deze sig is een manueel virus!! Als je dit leest heb je het. Mail dit bericht naar iedereen die je kent, en verwijder alle bestanden van je computer.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Fiander schreef op dinsdag 21 april 2009 @ 10:55:
Dus wat je eigenlijks wilt, is dat na het opbouwen van de treeview, er item voor item een thumbnail in een ander scherm getoont word ?

iets als de verkenner welke op thumbnailview staat ?

Dan zit er weinig meer op dan de Thread een event laten vuren elke keer dat er een item klaar is, en je main thread ( de UI ) naar dat event laten luisteren. Je kun een event maken welke een plaatje als extra object heeft, en bij het vuren van het event dat object vullen. Bij het afhandelen van het event kun je je plaatje dan in e vinden.
dit is inderdaad wat ik wil... bedankt voor de hulp, ik heb nog wat opzoekwerk gedaan over callbacks en heb volgende link als zeer nuttig ervaren. ik dacht ik post het hier ook even dan heeft iemand er in de toeko;st er ook nog iets aan

http://www.beacosta.com/blog/?p=34

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Als je de bestanden uit de tree haalt, dan kun je de listview op virtual mode zetten. In virtual mode worden alleen de objecten geladen welke ook daadwerkelijk zichtbaar zijn. De list weet dus dat je bijvoorbeeld 1200 items hebt, maar in de listview zelf worden maar laat zeggen 10 items ingeladen. Bij het scrollen in de lijst worden items die niet meer zichtbaar zijn verwijderd en worden weer nieuwe items toegevoegd.

In winforms moet je dit 'virtual' zelf nog regelen met enkele events. In WPF is dat als een stuk gemakkelijk door middel van de VirtualizingStackPanel (Attached property voor StackPanel).

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

Verwijderd

Ik zou zeggen: gebruik de forum control - > BackGroundWorker.

Deze laat je de items laden en elke keer als er een item is geladen vuur je 'resetprogressstate' af. In de eventhandler kun je het item toevoegen en de listview invalidaten zodat deze de nieuwe item toont.

Kun je zelfs nog een mooie progressbar tonen ;)

[ Voor 12% gewijzigd door Verwijderd op 22-04-2009 12:14 ]


Acties:
  • 0 Henk 'm!

  • Phyxion
  • Registratie: April 2004
  • Niet online

Phyxion

_/-\o_

Verwijderd schreef op dinsdag 21 april 2009 @ 10:03:
hallo,

ik heb volgende regel code die een method oproept die een Listview update via een thread


C#:
1
this.Dispatcher.BeginInvoke(DispatcherPriority.Render, (ThreadStart)delegate { dodo(); });


C#:
1
2
3
4
private void dodo()
        {
            view.getDirectoriesTreeSource((TreeViewItem)e.Source);
        }


het probleem is nu dat het wel werkt, maar ik zou graag hebben dat ieder geladen item getoond wordt in de Listview van zodra het geladen is. nu wordt eerst alle info geladen en wordt de UI pas geupdated van zodra alles geladen is. dat geeft natuurlijk dat als er 1000 items te laden zijn dat de UI niet lijkt te reageren, terwijl er mogelijk al 500 items geladen zijn.


bedankt voor de hulp
Nadeel hiervan is dat als je een scrollbar gebruikt bij de items je wel goed moet checken waar je zit anders wordt de scrollbar ook weer reset bij andere items. Verder is het veel sneller om alles er in 1x in te jassen dan stuk voor stuk (Of doe een update per 100 items bijvoorbeeld). Het is maar wat je wilt maar hou er wel rekening mee.

'You like a gay cowboy and you look like a gay terrorist.' - James May

Pagina: 1