Page 1 sur 1

remplir une ListIconGadget rapidement

Publié : sam. 30/oct./2004 19:25
par Le Soldat Inconnu
Salut,

j'ai une ListIconGadget dans laquelle je charge beaucoup beaucoup de donnée
entre 20000 et 50000 avec des calculs assez lent.

j'ai déjà réussi à déplacer le calcul en dehors du remplissage de la ListIcon
(je fais les calcul uniquement pour les éléments qui s'affiche avec un callBack)

Donc j'ai simplement à remplir mon ListIcon avec des lignes vides.

Mais ça reste très lent.

est-ce que quelqu'un à un truc pour arriver à remplir une liste très vite ?

voici un code pour tester

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.9
; 
; Explication du programme :
; Pour faire des programmes de test rapidement, il ne reste qu'a rajouter les gadgets et la gestion des évènements.


; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 300, 300, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Test") = 0 Or CreateGadgetList(WindowID()) = 0
  End
EndIf

ListIconGadget(0, 0, 0, 300, 210, "test", 100, #PB_ListIcon_MultiSelect | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
For n = 1 To 4
  AddGadgetColumn(0, n, Str(n), 30)
Next

Temps = GetTickCount_()
For n = 0 To 20000
  AddGadgetItem(0, n, "")
Next

Temps = GetTickCount_() - Temps

TextGadget(1, 0, 250, 100, 15, Str(Temps))

Repeat
  Event = WaitWindowEvent()
  
Until Event = #PB_EventCloseWindow

End

Publié : dim. 31/oct./2004 6:07
par Anonyme2
C'est l'affichage qui prend beaucoup de temps malgré le fait que ça ne s'affiche que lorsque la liste est pleine.

J'ai verrouillé l'affichage et c'est plus rapide

De 8400 environ à 3500 ms

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu 
; Version de PB : 3.9 
; 
; Explication du programme : 
; Pour faire des programmes de test rapidement, il ne reste qu'a rajouter les gadgets et la gestion des évènements. 


; Création de la fenêtre et de la GadgetList 
If OpenWindow(0, 0, 0, 300, 300, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Test") = 0 Or CreateGadgetList(WindowID()) = 0 
  End 
EndIf 

ListIconHwnd = ListIconGadget(0, 0, 0, 300, 210, "test", 100, #PB_ListIcon_MultiSelect | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection) 
For n = 1 To 4 
  AddGadgetColumn(0, n, Str(n), 30) 
Next 

Temps = GetTickCount_()
UpdateWindow_(GadgetID(0))          ; <-- ici pour afficher la liste vide au départ
LockWindowUpdate_(GadgetID(0))   ; <-- ici
For n = 0 To 20000
  AddGadgetItem(0, n, "1") 
Next 
LockWindowUpdate_(0)   ; <-- ici

Temps = GetTickCount_() - Temps 

TextGadget(1, 0, 250, 100, 15, Str(Temps)) 

Repeat 
  Event = WaitWindowEvent() 
  
Until Event = #PB_EventCloseWindow 

End

Publié : dim. 31/oct./2004 15:03
par Le Soldat Inconnu
oui, c'est déjà fait, j'ai oublié de le préciser. Merci quand même :wink:

au fait 3500 ms, c'est la temps que je mets sur le 500 mhz de mes parents 8O
C'est quoi ton PC ???

En passant l'exe en priorité haute, on obtiens environ 3s (toujours sur le 500mhz)
mais bon, ça signifie que tous les autres programmes sont ralentis

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.9
; 
; Explication du programme :
; Pour faire des programmes de test rapidement, il ne reste qu'a rajouter les gadgets et la gestion des évènements.


; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 300, 300, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Test") = 0 Or CreateGadgetList(WindowID()) = 0
  End
EndIf

ListIconGadget(0, 0, 0, 300, 210, "test", 100, #PB_ListIcon_MultiSelect | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
For n = 1 To 4
  AddGadgetColumn(0, n, Str(n), 30)
Next

UpdateWindow_(WindowID())

Temps = GetTickCount_()

LockWindowUpdate_(GadgetID(0)) ; On vérouille l'affichage
SetPriorityClass_(GetCurrentProcess_(), #HIGH_PRIORITY_CLASS)
For n = 0 To 20000
  AddGadgetItem(0, n, "")
Next
SetPriorityClass_(GetCurrentProcess_(), #NORMAL_PRIORITY_CLASS)
LockWindowUpdate_(0)

Temps = GetTickCount_() - Temps

TextGadget(1, 0, 250, 100, 15, Str(Temps))

Repeat
  Event = WaitWindowEvent()
  
Until Event = #PB_EventCloseWindow

End

Publié : dim. 31/oct./2004 15:14
par Anonyme2
Celeron 2GHz, 1G0 de RAM.

J'ai toujours plein de truc ouvert en même temps sans compter tout le bazard en tache de fond.

J'ai essayé directement avec le message LVM_Insertitem mais c'etait encore moins bon 8O

Publié : dim. 31/oct./2004 15:48
par Le Soldat Inconnu
1.8 seconde sur mon AMD 900mhz

Il déconne ton PC ? 8O

Publié : mar. 02/nov./2004 20:27
par Flype
hummmm, çà m'étonne pas tout çà mais et si on cachait le gadget juste avant de le remplir et qu'on le fait réapparaitre juste après.
bilan 580ms comme çà sur un 700mhz et 2220ms avec la technique habituelle.

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu 
; Version de PB : 3.9 
; 
; Explication du programme : 
; Pour faire des programmes de test rapidement, il ne reste qu'a rajouter les gadgets et la gestion des évènements. 


If OpenWindow(0, 0, 0, 300, 300, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Test") = 0 Or CreateGadgetList(WindowID()) = 0 
  End 
EndIf 
ListIconGadget(0, 0, 0, 300, 210, "test", 100, #PB_ListIcon_MultiSelect | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection) 
For n = 1 To 4 : AddGadgetColumn(0, n, Str(n), 30) : Next 

total = 10000

;----
HideGadget(0,1)
Temps1 = GetTickCount_() 
For n = 0 To total
  AddGadgetItem(0, n, "test") 
Next 
Temps1 = GetTickCount_() - Temps1 
HideGadget(0,0)
;----
ClearGadgetItemList(0)
;----
Temps2 = GetTickCount_() 
For n = 0 To total 
  AddGadgetItem(0, n, "") 
Next 
Temps2 = GetTickCount_() - Temps2
;----

TextGadget(1, 0, 250, 100, 15, Str(Temps1)) 
TextGadget(2, 0, 268, 100, 15, Str(Temps2)) 
Repeat : Until WaitWindowEvent() = #PB_EventCloseWindow 
End

Publié : mar. 02/nov./2004 20:31
par Chris
190 dans le premier cas, 1015 dans le second sur un portable en 800 Mhz

Y a pas photo :lol:

Publié : mar. 02/nov./2004 20:41
par Le Soldat Inconnu
Génial ;)

je teste et j'obtiens : 550 ms sur le 500mhz de mes parents

Merci Flype

Publié : mar. 02/nov./2004 21:17
par nico
Avec mon Athlon 1.5, j'obtiens 60 et 3656

et pour un total de 100.000 : 1853 et 37084

:D

Publié : mer. 03/nov./2004 7:35
par Anonyme2
Ce matin sans trop de prog ouverts en même temps j'ai 47 et 4187 :D

Publié : mer. 03/nov./2004 11:59
par Backup
moi j'obtien 32 et 328

avec 42 process , mais je sais pas a quoi correspondent ces chiffres ! :? :oops:

Publié : mer. 03/nov./2004 21:02
par Flype
impressionnant hein :P

pour dobro:

ca concerne le temps qu'il faut à un ListIconGadget
pour lui ajouter 20000 lignes :

1ere valeur = x millisecondes - gadget caché - HideGadget(0,1)
2eme valeur = x millisecondes - gadget visible - HideGadget(0,0)

Publié : jeu. 04/nov./2004 11:38
par Fred
Interessant :)