ListIconGadget schnell mit 3700 Einträge füllen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Joshua314
Beiträge: 115
Registriert: 06.04.2005 22:44

ListIconGadget schnell mit 3700 Einträge füllen

Beitrag 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")

Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

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

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Joshua314
Beiträge: 115
Registriert: 06.04.2005 22:44

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

Beitrag 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
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

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

Beitrag von RSBasic »

Hast du mal meinen Code getestet? Dauert es bei dir genauso lange?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

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

Beitrag 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.
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

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

Beitrag 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?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

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

Beitrag von NicTheQuick »

Ich habe mit Debugger 498 ms, ohne Debugger eher so 590 ms. Lustig. :D
Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

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

Beitrag 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()
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

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

Beitrag von RSBasic »

@edel
:shock: :allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1754
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

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

Beitrag 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?
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Antworten