Seite 1 von 1

Befehl zu langsam

Verfasst: 21.10.2007 14:58
von Thomas
Gibt es eine Möglichkeit diesen Befehl schneller zu machen? (ca. 3sek für 400 Elemente ist mir doch zu langsam)

Code: Alles auswählen

SendMessage_(GadgetID(ComboBox), #CB_ADDSTRING, 0, String$)
hiermit gehts auch nicht schneller:

Code: Alles auswählen

AddGadgetItem(GadgetID(ComboBox), -1, String$)

Verfasst: 21.10.2007 15:36
von FGK
Hi Thomas,

das ist das selbe Problem wie mit ner Listbox befüllen.
Du mußt den Redraw ausschalten.

Code: Alles auswählen

SendMessage_(hwnd,#WM_SETREDRAW,0,0)
dann befüllen und wieder einschalten


Gruß FGK

Re: Befehl zu langsam

Verfasst: 21.10.2007 15:42
von Kiffi
Thomas hat geschrieben:(ca. 3sek für 400 Elemente ist mir doch zu langsam)
bei mir dauert es mit nachfolgendem Code (leicht modifiziert aus der
PB-Hilfe) maximal 50 Millisekunden

Code: Alles auswählen

If OpenWindow(0, 0, 0, 270, 140, "ComboBoxGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  ComboBoxGadget(0, 10, 10, 250, 100, #PB_ComboBox_Editable)
  AddGadgetItem(0, -1, "ComboBox editable...")
  ComboBoxGadget(1, 10, 40, 250, 100)
  z1=ElapsedMilliseconds()
  For a = 1 To 400 : AddGadgetItem(1, -1,"ComboBox item " + Str(a)) : Next a
  z2=ElapsedMilliseconds()
  SetGadgetState(1, 2)    ; set (beginning with 0) the third item as active one
  SetWindowTitle(0, Str(z2-z1))
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
entweder, Du hast was in Deinem Code falsch oder aber Du hast eine
ziemlich alte Möhre, auf dem der Code läuft.

Grüße ... Kiffi

Verfasst: 21.10.2007 19:02
von roherter
Bei mir 16 Millisekunden.

Verfasst: 21.10.2007 19:18
von #NULL
knapp 11ms, ohne debugger (1188ms für 40000 items)
mit FGK's methode bin ich bei den 40000 items um gerade mal 30ms schneller. vielleicht hab ich es aber auch nicht
richtig gemacht (GadgetID() als handle?)

Verfasst: 21.10.2007 20:59
von Thomas
bei mir sinds max. 32ms.

Das ganze liegt warscheinlich drann, dass das Ding ne LinkedList durchläuft und ein paar Abfragen macht.

Das ganze war so: Das ganze lief halt ganz normal in ca. 2-3s ab.
Dann hab ich mal die Zeile SendMessage_(GadgetID(ComboBox), #CB_ADDSTRING, 0, String$) rausgenommen, und es dauerte nichtmal ne halbe Sekunde.

wie wirds hiermit deaktiviert und wieder aktiviert?

Code: Alles auswählen

SendMessage_(hwnd,#WM_SETREDRAW,0,0) 

Verfasst: 21.10.2007 21:11
von Ligatur
Hallo,
ob #WM_SETREDRAW bei Combobox - Gadgets wirklich so viel bringt wie bei Listboxen weiß ich nicht, weil die Listbox ja sowieso meistens beim befüllen eingeklappt ist. Außerdem habe ich es mal ausprobiert und das Gadget wurde trotzdem aktualisiert, bezieht sich die Nachricht beim Comboboxgadget vieleicht nur auf den immer sichtbaren Teil?
Beschleunigen kann man das befüllen aber auf jeden Fall mit SendMessage_(GadgetID(Gadget), #CB_INITSTORAGE, Anzahl Items, benötigter Speicher für Strings). Bei Listboxen heißt dieselbe Message #LB_INITSTORAGE.
Zu SetRedraw: Mit SendMessage_(GadgetID, #WM_SETREDRAW, #True, 0 ) wird neuzeichnen zugelassen, mit SendMessage_(GadgetID, #WM_SETREDRAW, #False, 0 ) nicht.
Grüße,
Ligatur

Edit
Warum überhaupt AddGadgetItem(GadgetID(ComboBox), -1, String$)? Was hat denn da die GadgetID zu suchen. Ein Wunder, daß das überhaupt funktioniert.

Verfasst: 21.10.2007 21:21
von Kiffi
Thomas hat geschrieben:bei mir sinds max. 32ms.
ja, prima, dann liegt Dein Problem nicht im Befüllen der Combobox, sondern
im Optimieren Deiner Abfragen der LinkedList.

Grüße ... Kiffi

Verfasst: 22.10.2007 14:39
von Thomas
Ligatur hat geschrieben: Edit
Warum überhaupt AddGadgetItem(GadgetID(ComboBox), -1, String$)? Was hat denn da die GadgetID zu suchen. Ein Wunder, daß das überhaupt funktioniert.
Vertippt :oops: