Seite 1 von 4

ListIconGadget schnell mit 3700 Einträge füllen

Verfasst: 03.05.2016 11:37
von Joshua314
Hallo Zusammen,

ich muss ein ListIconGadget mit 4 Spalten mit 37000 Einträge füllen.
Lieder ist das Sehr langsam.
Den Redraw hab ich schon ausgeschaltet.
Kennt einer eine Methode, um die Daten schneller dort reizubekommen ?
Gruß Thomas

Code: Alles auswählen

 
       Add("Draw")
        PersonLoadState = #PersonLoadState_Idle    
        SendMessage_(GadgetID(#EingabeListIcon),#WM_SETREDRAW,0,0)
        LockMutex(Mdisplay)
        Zeile = 0 
        UnlockMutex(Mdisplay)
        ClearGadgetItems(#EingabeListIcon)
        ForEach Person()
          in = Person()\Call +Chr(10) + Person()\Name+Chr(10) + Person()\DOK +Chr(10) + Person()\MailAdress
          AddGadgetItem(#EingabeListIcon,Zeile,In)           
          LockMutex(Mdisplay)
 	        Zeile  +1          
          UnlockMutex(Mdisplay)
        Next Person()
        SendMessage_(GadgetID(#EingabeListIcon),#WM_SETREDRAW,1,0)
        Add("Fertig")


Re: ListIconGadget schnell mit 3700 Einträge füllen

Verfasst: 03.05.2016 11:53
von RSBasic
Hat es vielleicht mit deinem LockMutex und UnlockMutex in der Schleife zu tun?
Wenn ich den folgenden Code mit 37.000 Einträgen ausführe, dauert das bei mir nur circa 500 Millisekunden: http://www.rsbasic.de/aktualisierung/wi ... 3%BCgen.pb

Re: ListIconGadget schnell mit 3700 Einträge füllen

Verfasst: 03.05.2016 14:15
von Joshua314
RSBasic hat geschrieben:Hat es vielleicht mit deinem LockMutex und UnlockMutex in der Schleife zu tun?
Wenn ich den folgenden Code mit 37.000 Einträgen ausführe, dauert das bei mir nur circa 500 Millisekunden: http://www.rsbasic.de/aktualisierung/wi ... 3%BCgen.pb
Nein Liegt es nicht dran
ich habe es auch ohne den mutex versucht, keine Änderung.
Ich habe mal das AddGadgetItem weggelassen. --> Dann rennt es schnell durch
Es liegt rein an dem AddGadgetItem

Gruß Thomas

Re: ListIconGadget schnell mit 3700 Einträge füllen

Verfasst: 03.05.2016 14:18
von RSBasic
Hast du mal meinen Code getestet? Dauert es bei dir genauso lange?

Re: ListIconGadget schnell mit 3700 Einträge füllen

Verfasst: 03.05.2016 15:23
von mhs
Grundsätzlich muss man natürlich sagen, dass das ListIconGadget langsamer wird, je mehr Spalten es hat. Aber 4 Spalten ist nun auch nicht wirklich viel...

Gib uns doch mal eine Zeitangabe, wie lange es bei dir dauert.

Re: ListIconGadget schnell mit 3700 Einträge füllen

Verfasst: 03.05.2016 15:43
von RSBasic
Ich habe es jetzt genauso nachgestellt wie dein Code und komme nur auf 950 Millisekunden:

Code: Alles auswählen

EnableExplicit

Define EventID
Define a
Define StartTime
Define ElapsedTime

Structure Structure
  a.s
  b.s
  c.s
  d.s
EndStructure

Define NewList List.Structure()

For a=1 To 37000
  AddElement(List())
  List()\a = "Hallo " + Str(a)
  List()\b = "Pure " + Str(a)
  List()\c = "Basic " + Str(a)
  List()\d = "Welt " + Str(a)
Next

If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ListIconGadget(1, 10, 10, 480, 380, "Spalte 1", 100, 0)
  AddGadgetColumn(1, 1, "Spalte 2", 100)
  AddGadgetColumn(1, 2, "Spalte 3", 100)
  AddGadgetColumn(1, 3, "Spalte 4", 100)
  
  SendMessage_(GadgetID(1), #WM_SETREDRAW, 0, 0)
  
  StartTime = ElapsedMilliseconds()
  
  ForEach List()
    AddGadgetItem(1, -1, List()\a + Chr(10) + List()\b + Chr(10) + List()\c + Chr(10) + List()\d, 0, 0)
  Next
  
  SendMessage_(GadgetID(1), #WM_SETREDRAW, 1, 0)
  
  ElapsedTime = ElapsedMilliseconds()-StartTime
  
  MessageRequester("", Str(ElapsedTime) + " ms.", 0)
  
  Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow
      End
    EndIf
  ForEver
EndIf
Wie lange dauert dein Code normalerweise? Und wie lange dauert der von mir geschriebene Code? Mit oder ohne Debugger?

Re: ListIconGadget schnell mit 3700 Einträge füllen

Verfasst: 03.05.2016 16:03
von NicTheQuick
Ich habe mit Debugger 498 ms, ohne Debugger eher so 590 ms. Lustig. :D

Re: ListIconGadget schnell mit 3700 Einträge füllen

Verfasst: 03.05.2016 18:37
von edel
0 ms :lurk:

Code: Alles auswählen

EnableExplicit

Structure struct
  a.s
  b.s
  c.s
  d.s
EndStructure

#ARRAY_SIZE = 37000

Global Dim List.struct(#ARRAY_SIZE)

Procedure Callback(hwnd, msg, wparam, lparam)
  Protected *hdr.NMHDR
  Protected *di.NMLVDISPINFO
  Protected str.i
  
  If msg = #WM_NOTIFY
    *hdr = lparam
    
    If *hdr\code = #LVN_GETDISPINFO
      *di = lparam      
      
      Select *di\item\iSubItem
        Case 0
          str.i = @List(*di\item\iItem)\a
        Case 1
          str.i = @List(*di\item\iItem)\b
        Case 2
          str.i = @List(*di\item\iItem)\c
        Case 3
          str.i = @List(*di\item\iItem)\d
      EndSelect
      
      *di\item\pszText = str
      
      ProcedureReturn #True
    EndIf
    
  EndIf
  
  ProcedureReturn #PB_ProcessPureBasicEvents  
EndProcedure  

Procedure InitArray()
  Protected a
  For a = 0 To #ARRAY_SIZE   
    List(a)\a = "Hallo " + Str(a)
    List(a)\b = "Pure " + Str(a)
    List(a)\c = "Basic " + Str(a)
    List(a)\d = "Welt " + Str(a)
  Next
EndProcedure

Procedure Main()
  Protected EventID
  
  InitArray()
  
  If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
    SetWindowCallback(@Callback(), 0)
    
    ListIconGadget(1, 10, 10, 480, 380, "Spalte 1", 100, #LVS_OWNERDATA | #PB_ListIcon_FullRowSelect)
    AddGadgetColumn(1, 1, "Spalte 2", 100)
    AddGadgetColumn(1, 2, "Spalte 3", 100)
    AddGadgetColumn(1, 3, "Spalte 4", 100)
    
    SendMessage_(GadgetID(1), #LVM_SETITEMCOUNT, #ARRAY_SIZE, 0)
    
    Repeat      
    Until WaitWindowEvent() = #PB_Event_CloseWindow
    
  EndIf
  
EndProcedure:End Main()

Re: ListIconGadget schnell mit 3700 Einträge füllen

Verfasst: 03.05.2016 18:40
von RSBasic
@edel
:shock: :allright:

Re: ListIconGadget schnell mit 3700 Einträge füllen

Verfasst: 04.05.2016 00:03
von Andre
@edel: Cool! :allright:

Könnte ich auch gut brauchen, dafür müsste es dafür allerdings eine Cross-Plattform-Möglichkeit geben. Kennt jemand eine für MacOS, die ebenfalls eine solche Beschleunigung gegenüber AddGadgetItem() bietet?