Befehl zu langsam

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Thomas
Beiträge: 893
Registriert: 06.07.2006 19:24
Wohnort: Regensburg
Kontaktdaten:

Befehl zu langsam

Beitrag 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$)
v6.00
Benutzeravatar
FGK
Beiträge: 249
Registriert: 09.01.2005 14:02
Computerausstattung: i5-4430 CPU / 8GB RAM
GeForce GT630
Windows 10 Home / 64-bit
Wohnort: Augsburg

Beitrag 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
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Befehl zu langsam

Beitrag 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
a²+b²=mc²
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Beitrag von roherter »

Bei mir 16 Millisekunden.
Purebasic 5.0 32bit und 64 bit

I'm back from hell
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag 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?)
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Thomas
Beiträge: 893
Registriert: 06.07.2006 19:24
Wohnort: Regensburg
Kontaktdaten:

Beitrag 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) 
v6.00
Benutzeravatar
Ligatur
Beiträge: 196
Registriert: 09.07.2006 00:41

Beitrag 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.
Zuletzt geändert von Ligatur am 21.10.2007 21:25, insgesamt 1-mal geändert.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Benutzeravatar
Thomas
Beiträge: 893
Registriert: 06.07.2006 19:24
Wohnort: Regensburg
Kontaktdaten:

Beitrag 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:
v6.00
Antworten