Accélérer le remplissage d'une listicongadget

Rubriques generale concernant SpiderBasic
Stefou
Messages : 234
Inscription : jeu. 18/janv./2007 14:08

Accélérer le remplissage d'une listicongadget

Message par Stefou »

Bonjour à tous et merci de me lire

J'aimerais remplir une lisicongadget avec beaucoup d'élément +de 5000 lignes(pièces d'un magasin d'atelier)

Mais voilà cela peut vraiment être long....

Si vous savez comment accélérer ce processus, je vous remercie de m'aider.

Code : Tout sélectionner

Procedure GadgetEvent()
  Select EventGadget()

    Case 2
  
      For i=1 To 1000
        AddGadgetItem(1, -1, "ID"+i+Chr(10)+"I like to do this faster!")
        AddGadgetItem(1, -1, "ID"+i+Chr(10)+"If you know how to do that...think you to help me :-)")
        AddGadgetItem(1, -1, "ID"+i+Chr(10)+"J'aimerais accélérer l'affichage d'une longue liste!!!")
        AddGadgetItem(1, -1, "ID"+i+Chr(10)+"Si vous savez comment faire...Merci de m'aider")
      Next
      
  EndSelect
EndProcedure


If OpenWindow(0, 100, 100, 600, 600, "ListIcon Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ButtonGadget(2,5,2,100,20,"Go")
  ListIconGadget(1, 5, 25, 590, 565, "ID", 100, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
  AddGadgetColumn(1, 1, "NOM", 250)

  BindEvent(#PB_Event_Gadget, @GadgetEvent())

EndIf
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Accélérer le remplissage d'une listicongadget

Message par Ar-S »

Salut Stephou.
J'ai testé avec 5000 entrées. Sur un i5 6600K je mets 1.5 sec pour tout afficher... Je trouve pas que ce soit spécialement long !? 8O
Du as désactivé le débug pour tes tests ?

En cachant la fenêtre pendant le traitement, je gagne cependant la moitié du temps !

Code : Tout sélectionner

 Procedure GadgetEvent()
   Select EventGadget()
 
     Case 2
       
       HideWindow(0,1)  ; essaye avec et sans 

       start = ElapsedMilliseconds()
       For i=1 To 5000
         AddGadgetItem(1, -1, "ID"+i+Chr(10)+"I like to do this faster!")
       Next
       endtime = ElapsedMilliseconds()-start
       
       MessageRequester("",Str(endtime) + " ms",0)
      
 HideWindow(0,0) ; essaye avec et sans 
   EndSelect
 EndProcedure
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Accélérer le remplissage d'une listicongadget

Message par falsam »

@Ar-s oui c'est rapide avec un exe PureBasic. :wink:

Avec Spiderbasic ce même code est généré en JavaScript et il faut environ 4 secondes (sans debug) pour afficher le résultat.

Petite remarque MessageRequester() n'existe pas avec SpiderBasic
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Accélérer le remplissage d'une listicongadget

Message par Ar-S »

Oups je n'avais pas vu que l'on était dans la section spider ! :roll:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Accélérer le remplissage d'une listicongadget

Message par falsam »

Une solution avec une gestion d'un timer.

Code : Tout sélectionner

Procedure GetDatabase()  
  Static i
  
  AddGadgetItem(1, -1, "ID"+i+Chr(10)+"I like to do this faster!")
  AddGadgetItem(1, -1, "ID"+i+Chr(10)+"If you know how to do that...think you to help me :-)")
  AddGadgetItem(1, -1, "ID"+i+Chr(10)+"J'aimerais accélérer l'affichage d'une longue liste!!!")
  AddGadgetItem(1, -1, "ID"+i+Chr(10)+"Si vous savez comment faire...Merci de m'aider")
  
  SetGadgetText(3, Str(i * 4) + " / 4000")
  
  i+1 
  
  If i > 1000
    UnbindEvent(#PB_Event_Timer, @GetDatabase())
    RemoveWindowTimer(0, 1)
    DisableGadget(2, #False)
  EndIf
EndProcedure

Procedure GadgetEvent()
  Select EventGadget()
    Case 2
      DisableGadget(2, #True)
      AddWindowTimer(0, 1, 0)
      BindEvent(#PB_Event_Timer, @GetDatabase())
  EndSelect
EndProcedure

If OpenWindow(0, 100, 100, 600, 600, "ListIcon Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CloseDebugOutput()
  
  ButtonGadget(2,5,2,100,20,"Go")
  TextGadget(3, 110, 2, 100, 20, "")
  ListIconGadget(1, 5, 25, 590, 565, "ID", 100, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
  AddGadgetColumn(1, 1, "NOM", 250)
  
  BindEvent(#PB_Event_Gadget, @GadgetEvent())
EndIf
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Accélérer le remplissage d'une listicongadget

Message par Ollivier »

1) Si, au lieu de mettre -1, vous mettiez un rang précis (1,2,3, etc...), ça économiserait du temps ou pas ?

2) Est-ce que créer 5000 items vides dans un temps initial, puis remplacer les items ensuite, ça ne diminue pas le temps de remplacement ?
Stefou
Messages : 234
Inscription : jeu. 18/janv./2007 14:08

Re: Accélérer le remplissage d'une listicongadget

Message par Stefou »

Merci les gars pour vos réponses

@Ar-S: je te remercie pour ton implication dans la vie du forum, c'est super serviable de ta part.

@Ollivier: J'ai cru à tes idées, mais ça n'a rien changé....snif

@falsam: Génial cette gestion de timer, je débute en SB et n'ayant pas thread je ne savais pas comment faire, et je n'avais pas eu l'idée de prendre un timer (que j'utilise pourtant régulièrement en PB)

Bon par contre il n'y a rien qui accélère....

Mais en bidouillant vos exemples, je suis tombé sur le code ci dessous.
C'est quasi instantané, par contre l'affichage clignote un peu lorsque l'on bouge la liste.

Surprenant non!!! ???

Code : Tout sélectionner

If OpenWindow(0, 100, 100, 600, 600, "ListIcon Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CloseDebugOutput()
  
  ButtonGadget(2,5,2,100,20,"Go")
  TextGadget(3, 110, 2, 100, 20, "")
  ListIconGadget(1, 5, 25, 590, 565, "ID", 100, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
  AddGadgetColumn(1, 1, "NOM", 250)
  
    For i=0 To 4000
        AddGadgetItem(1, -1, "ID"+i+Chr(10)+"I like to do this faster!")
     Next

EndIf
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Accélérer le remplissage d'une listicongadget

Message par Ollivier »

Tu cherches la petite bête ! Mais c'est bon à savoir le jour où je serai motivé à m'offrir SB.

T'es en train de sous-entendre qu'il perd du temps à passer d'un gadget à l'autre ?
Stefou
Messages : 234
Inscription : jeu. 18/janv./2007 14:08

Re: Accélérer le remplissage d'une listicongadget

Message par Stefou »

Je ne sous entends rien je constate , stupéfait, je ne comprends pas pourquoi...???
Mais ça peut servir
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Accélérer le remplissage d'une listicongadget

Message par Ollivier »

Et c'est stupéfiant ! Ça (pas toi, le système dans son résultat sans savoir quelle couche logicielle est responsable de ça) sous-entend qu'il est recommandé de traiter certaines tâche, un gadget après l'autre.

Merci pour ce partage d'idée (même de simple constat !).
Mesa
Messages : 1092
Inscription : mer. 14/sept./2011 16:59

Re: Accélérer le remplissage d'une listicongadget

Message par Mesa »

10 000 entrées en 0.1 s mais sous Windows seulement.

Code : Tout sélectionner

EnableExplicit

Define EventID
Define a
Define StartTime
Define ElapsedTime

If OpenWindow(0,0,0,500,400,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ListIconGadget(1,10,10,480,380,"",400,0)
  SendMessage_(GadgetID(1),#WM_SETREDRAW,0,0) ; le gadget n'est pas redessiné après un changement

  StartTime = ElapsedMilliseconds()

  For a=1 To 10000
    AddGadgetItem(1,-1,"Item "+Str(a),0,0)
  Next

  SendMessage_(GadgetID(1),#WM_SETREDRAW,1,0) ; on redessine

  ElapsedTime = ElapsedMilliseconds()-StartTime
 
  MessageRequester("",Str(ElapsedTime)+" ms. après 10.000 entrées.",0)
 
  Repeat
    EventID=WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow
      End
    EndIf
  ForEver
EndIf
Mesa.
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Accélérer le remplissage d'une listicongadget

Message par Ar-S »

Bien joué, j'avais tenté avec un disablegadget ce qui ne changeait rien ;)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Accélérer le remplissage d'une listicongadget

Message par falsam »

@Mesa : La demande était pour SpiderBasic :wink:
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre