ListBox() statt Array ?

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12910
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

ListBox() statt Array ?

Beitrag von AUGE_OHR »

hi,

ich arbeite gerne mit Array auch weil die schön schnell sind.
nun ist die "übliche" Method AADD() und das ist schnell ... wirklich ?

für eine XbpListBox() oder XbpComboBox() würde man ja AddItem() nehmen und das ist ja deutlich langsamer.

was wäre nun wenn ich eine Listbox "schneller" füllen könnte mit 1.000.000 Elementen als per AADD() ein Array ?
gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9373
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: ListBox() statt Array ?

Beitrag von Tom »

Hallo, Jimmy.

Willst Du darauf hinaus, dass man in diesem Fall ein (unsichtbares) Listbox-Objekt als schnelleres Array-Replacement benutzen könnte? Was ist mit der Suche im Array und mit dem Löschen/Einfügen/Ersetzen von Elementen?
Herzlich,
Tom
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2829
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 97 Mal
Danksagung erhalten: 13 Mal

Re: ListBox() statt Array ?

Beitrag von georg »

Hallo,


oder es könnte die Frage sein, ob (und wie) man an das Array herankommt, in dem die ListBox() Einträge abgelegt sind.


Gruss,

Georg
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12910
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: ListBox() statt Array ?

Beitrag von AUGE_OHR »

ich vergass zu sagen das ich von eine "native" Listbox() spreche.
Tom hat geschrieben:Willst Du darauf hinaus, dass man in diesem Fall ein (unsichtbares) Listbox-Objekt als schnelleres Array-Replacement benutzen könnte?
:thumbright: du bist gut !
Tom hat geschrieben:Was ist mit der Suche im Array und mit dem Löschen/Einfügen/Ersetzen von Elementen?
hm ... ja ... die API Befehle wären da ... man müsste dafür dann einen Wrapper schreiben.

ich bin noch beim ausprobieren mit der "native" ListBox wo ich eine Demo mit "Zeigern" ( Pointer ) statt String als Elemente ausgestattet habe.
damit hab ich erstaunliche Ergebniss erreicht wenn ich "grosse" Datenmengen verarbeiten will.
primär denke ich da an "Import" Dateien die ich im Speicher "weiterverarbeiten" möchte was dann bis 2 GB möglich wäre.
btw. Pablo sagt das 3GB zwar möglich wären, aber nicht mit ALINK gehen würde !

die Demo ist noch nicht gut genug um die raus-zugeben, also hab noch etwas Geduld. Bild
gruss by OHR
Jimmy
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: ListBox() statt Array ?

Beitrag von Herbert »

Sind solche Methoden sinnvoll? Letztendlich wird der GUI-Speicher arg belastet.
Was ist, wenn ich 3,4, solcher Listboxen erstellen würde?
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12910
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: ListBox() statt Array ?

Beitrag von AUGE_OHR »

hi,

scheint so als wenn ich das Demo von Pablo doch noch nicht verstanden habe.
bei weiteren Test komme ich nicht auf gewünschte Resultate was die Geschwindigkeit angeht ...
Herbert hat geschrieben:Letztendlich wird der GUI-Speicher arg belastet
genau darum geht es das Xbase++ den Speicher "belastet".

Es wird für jede Aktion "einzeln" Speicher angefordert ... und irgendwann freigegeben.
um so was muss ich nun der Xbase++ User zum Glück nicht kümmern das macht dann der CG.
trotzdem entstehen dadurch "Löcher" ... der Speicher ist sozusagen "defragmentiert".

das Gegenteil wäre nun den gesamten Speicher anzufordern und "ein einem Stück" in den Speicher zu "schreiben" ( Peek ).

Beispiel AADD vs ARRAY

Code: Alles auswählen

a.)
   FOR i := 1 TO 512
         AADD(aArray,STR(i))
   NEXT

b.)
   aArray := ARRAY[512}
   FOR i := 1 TO 512
        aArray[i] := STR(i)
   NEXT
welche Version ist "schneller" ?
vermutlich wird man bei "nur" 512 kaum was feststellen ( SET DECIMALS TO 6 ) aber leider "knallt" es wenn man z.b. ARRAY[4096] versucht.

bei Listbox() / Combobox() wird nun "empfohlen" bei grossen Datenmengen den Speicher vorher anzufordern

Code: Alles auswählen

   @User32:SendMessageA(::hLbox,LB_INITSTORAGE,nNum,nBytes )
was sich deutlich (200-300%) bemerkbar macht.

nun habe ich beim Ownerdraw von String auf "Zeiger" ( Pointer ) umgestellt.
aus der DrawItemStruct() erhalte ich vom MEMBER "itemData" einen "Zeiger" ( Pointer ) wo ich mein Element im Speicher "finde"

Code: Alles auswählen

   cItemText := PeekStr(::oDrawItemStruct:itemData,0,-1)
ich fragte mich bzw. Pablo ob ich auch das "Gegenteil" davon machen könnte, also "direkt" in den Speicher schreiben...

die Antwort von Pablo war dann

Code: Alles auswählen

cStr := "Hello"
 p := @kernel32:HeapAlloc(hHeap,8,Len(cStr)+1)
PokeStr( p,0,cStr)
This will allow you to allocate big amount of items
bis 2GB ;)

aber was würde es mir nützen "schnell" 2GB in den Speicher zu legen aber darin nicht "navigieren" zu können.
deshalb die Idee der "unsichtbaren" Listbox wo ich mittels der API Functionen im Grunde alles zum "navigieren" habe um damit direkt auf Speicher Adressen zuzugreifen. Um nun nicht mit API Funtionen zu hantieren kommt das ganze in einen "Wrapper" damit man mit den "gewohnten" Methoden wie GetData() / SetData() / GetItem() etc. arbeiten kann.

irgendwie geht es wohl auch ( bei Pablo in C )
This allow to read the initial data ( about 2 MB) in about 3 milliseconds, the same using DBFs/arrays in Xbase++ would take several some minutes.
:shock: aber wie es Pablo nun macht hab ich wohl doch noch nicht ganz verstanden ... 8-[
gruss by OHR
Jimmy
Antworten