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
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.

Re: ListIconGadget schnell mit 3700 Einträge füllen
Verfasst: 03.05.2016 18:37
von edel
0 ms
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

Re: ListIconGadget schnell mit 3700 Einträge füllen
Verfasst: 04.05.2016 00:03
von Andre
@edel: Cool!
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?