ListIconGadget schnell mit 3700 Einträge füllen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Lord
Beiträge: 313
Registriert: 21.01.2008 19:11

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

Beitrag 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?
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 »

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.
Lord
Beiträge: 313
Registriert: 21.01.2008 19:11

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

Beitrag von Lord »

Hallo edel!
edel hat geschrieben:...
Probier es bitte noch einmal aus.
Ja, jetzt funktioniert es gut.
Danke!
Bild
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

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

Beitrag 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!
Benutzeravatar
Jac de Lad
Beiträge: 56
Registriert: 24.07.2019 17:53
Computerausstattung: AMD Ryzen 1700X, MSI B350 PC Mate, 256GB SSD, 16GB RAM@2933MHz, AMD Radeon 7770 OC, 106TB HDD, 28" Samsung 4k-Monitor, Windows 10 x64
Wohnort: Riesa
Kontaktdaten:

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

Beitrag 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?
Demivec
Beiträge: 49
Registriert: 22.02.2008 20:49
Wohnort: Utah, USA

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

Beitrag 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.
Bild
Benutzeravatar
Jac de Lad
Beiträge: 56
Registriert: 24.07.2019 17:53
Computerausstattung: AMD Ryzen 1700X, MSI B350 PC Mate, 256GB SSD, 16GB RAM@2933MHz, AMD Radeon 7770 OC, 106TB HDD, 28" Samsung 4k-Monitor, Windows 10 x64
Wohnort: Riesa
Kontaktdaten:

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

Beitrag von Jac de Lad »

Ok danke, da liegt der Fehler bei mir.
Benutzeravatar
Jac de Lad
Beiträge: 56
Registriert: 24.07.2019 17:53
Computerausstattung: AMD Ryzen 1700X, MSI B350 PC Mate, 256GB SSD, 16GB RAM@2933MHz, AMD Radeon 7770 OC, 106TB HDD, 28" Samsung 4k-Monitor, Windows 10 x64
Wohnort: Riesa
Kontaktdaten:

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

Beitrag von Jac de Lad »

Ah stimmt, da war der Debugger schuld.
Benutzeravatar
Jac de Lad
Beiträge: 56
Registriert: 24.07.2019 17:53
Computerausstattung: AMD Ryzen 1700X, MSI B350 PC Mate, 256GB SSD, 16GB RAM@2933MHz, AMD Radeon 7770 OC, 106TB HDD, 28" Samsung 4k-Monitor, Windows 10 x64
Wohnort: Riesa
Kontaktdaten:

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

Beitrag 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
Benutzeravatar
GlassJoe
Beiträge: 108
Registriert: 11.06.2017 20:25
Computerausstattung: 2 x AMD Phenom II x4 945,2x Dell Latitude X300, Dell Latitude D410, Hp Compaq NC4400

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

Beitrag 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.
https://www.geek.com/tech/a-commodore-6 ... s-1672510/
٩(̾●̮̮̃̾•̃̾)۶ __̴ı̴̴̡̡̡ ̡͌l̡̡̡ ̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ ̡͌l̡̡̡̡.___٩(- ̮̮̃-̃)۶
Antworten