Seite 4 von 4

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

Verfasst: 11.05.2019 16:45
von Lord
Hallo Edel!

Dein Code produziert bei mir einen Fehler:
[16:23:15] Warte auf den Start des Executable...
[16:23:15] Executable-Typ: Windows - x64 (64bit, Unicode)
[16:23:15] Executable gestartet.
[16:23:15] [ERROR] Zeile: 48
[16:23:15] [ERROR] Array-Index außerhalb der zulässigen Grenzen.
Der erste Wert in *lvcd\nmcd\dwItemSpec ist größer als ein Arreyindex: 8791779384438.
Wenn ich diese ersten Wert "übergehe", funktioniert es:

Code: Alles auswählen

      If *lvcd\nmcd\dwDrawStage | #CDDS_SUBITEMPREPAINT
        If *lvcd\nmcd\dwItemSpec < #ARRAY_SIZE;  <--- Zeile eingefügt
          *item = myList(*lvcd\nmcd\dwItemSpec)
          
          *lvcd\clrText = RGB(255-Red(*item\myColor), 255-Green(*item\myColor), 255-Blue(*item\myColor))
          *lvcd\clrTextBk = *item\myColor   
        Else ; eingefügt, nicht zwingend notwendig
          Debug *lvcd\nmcd\dwItemSpec ; eingefügt, nicht zwingend notwendig
        EndIf  ;  <--- Zeile eingefügt
      EndIf       
    EndIf

Woher stammt der erste Wert, wozu dient er, was kann man damit erreichen/machen?

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

Verfasst: 11.05.2019 20:01
von edel
Die If-Abfrage war falsch, hab's korrigiert. "dwItemSpec" ist ein Zeiger, der aber, je nach Control, anders gesetzt wird.

Probier es bitte noch einmal aus.

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

Verfasst: 12.05.2019 10:07
von Lord
Hallo edel!
edel hat geschrieben:...
Probier es bitte noch einmal aus.
Ja, jetzt funktioniert es gut.
Danke!

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

Verfasst: 14.08.2019 21:40
von HeX0R
edel hat geschrieben:Huhu Hex0r,

die Daten kannst du nicht mehr per SetGadgetItemData setzen, wohl aber in deinem Array. Das Gleiche kannst du auch mit der Farbe machen.
Asche auf mein Haupt!
Habe das eben wiedergefunden und festgestellt, dass ich mich nicht mal bedankt habe, das geht ja mal gar nicht!
Vielen Dank edel, mittlerweile funktioniert alles wunderbar und pfeilschnell!

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

Verfasst: 08.07.2020 12:35
von Jac de Lad
Wenn ich den Code von edel, von der ersten Seite, auf z.B. 60000 Einträge ändere geht er nicht mehr. Mache ich da was falsch oder ist das eine natürliche Grenze durch Windows?

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

Verfasst: 08.07.2020 12:55
von Demivec
jacdelad hat geschrieben:Wenn ich den Code von edel, von der ersten Seite, auf z.B. 60000 Einträge ändere geht er nicht mehr. Mache ich da was falsch oder ist das eine natürliche Grenze durch Windows?
Ich habe es mit 20000000 Einträgen getestet und es hat funktioniert. Windows 10 x64 Purebasic v5.72 LTS.

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

Verfasst: 08.07.2020 13:04
von Jac de Lad
Ok danke, da liegt der Fehler bei mir.

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

Verfasst: 08.07.2020 13:28
von Jac de Lad
Ah stimmt, da war der Debugger schuld.

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

Verfasst: 08.07.2020 15:20
von Jac de Lad
Öhm, wie kann ich das auf ein ListIconGadget beschränken, wenn ich mehrere habe? In hwnd steht ja das Handle des übergeordneten Fensters.

Edit: Hab's schon gefunden: *hdr\hwndFrom

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

Verfasst: 04.08.2020 19:10
von GlassJoe
Hi

Also ich hatte das selbe Problem, obwohl

SendMessage_(GadgetID(#BLABLA),#WM_SETREDRAW,#FALSE,0)

ging das hinzufügen sau lahm (6 Cols, paar Tausend Einträge)

Das Problem war das es in einem Thread lief und zusätzlich das ListIcon noch in einem SplitterGadget steckte !

Es wird optisch nicht refreshed (und genau desshalb fiel es mir ewig nicht auf b.z.w ich konnte mir nicht erklären was da los
ist) aber verarbeitet wird alles im Tempo als wäre das Redraw noch an.
Selbst mit den besten Umständen ist es in einem Thread noch 4 x so langsam wie ausserhalb eines Threads !

Egal ob ich schon vor dem Thread den Refresh disable, oder innerhalb vom Thread, sobald ein Thread eine Liste füllt
ist es 4 x - 15x so langsam.............würde mich nicht wundern wenn das Problem bei einer alten Version (4.60 z.B die letzte die nicht meckert wenn ein Fenster aus'm Callback gestartet wird, oder im Thread läuft) keine Probleme gibt.

Auch wird es schneller (eine Sek bei zig tausend einträgen) wenn mann ein SendMessage_(GadgetID(#BLABLA),#WM_SETREDRAW,#FALSE,0) an das SplitterGadget schickt in dem das ListIconGadget steckt (sollte das SplitterGadget ein Teil eines anderen sein, dann auch an das schicken) und danach halt an das ListIconGadget.

Code: Alles auswählen

            DisableWindow(#MainWin,1)
            DisableWindow(#SaltWin,1)
            SetSplitterRedrawState(#False) ; Schaltet das Redraw aller Splitter ab. Beschleunigt noch ein kleines bisschen, 
            ;merkt mann bei großen Listen. Bei einer 17,8MB Liste ist es eine Sekunde
            SetRedrawState(#False) ; Schaltet Redraw für alle Listen im SplitterGadget ab
            ;DisableWindow(#SaltWin,1)
            ;SaltTH = CreateThread(@CreateSaltList(),0) 
            ;/ THREAD BENUTZEN IST HIER SCHEISE !
            ;/ Es muss jeder Splitter Disabled werden und DANACH jede Liste, erst dann funzt es im Thread.
            ;/ Disabled mann nicht die Splitter ist es im Thread mindestens 15 x langsamer ! 3,5Sek statt 200ms usw !
            ;/ Disabled mann die Splitter und es läuft Thread ist es immer noch 4 x so langsam wie ohne Thread.
            CreateSaltList(0)
Mit mit funzen meine ich das es schneller ist und nicht refreshed wird, statt nur kein refresh aber sau lahm.