Simpler 32/64-Bit-Dis-Assembler in PB

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Simpler 32/64-Bit-Dis-Assembler in PB

Beitrag von edel »

Falls dir AddgadgetItem zu langsam ist, speichere alles in einem Array und lass es das Gadget selber auslesen.

Code: Alles auswählen

STRUCTURE Item
  ID.s
  Rnd.s
ENDSTRUCTURE

#item_count = 3000000

GLOBAL DIM daten.Item(#item_count - 1)

FOR i = 0 TO #item_count - 1
  daten(i)\ID = Str(i + 1) 
  daten(i)\Rnd = Str(Random(6666))
NEXT
  

PROCEDURE Callback(hwnd, msg, wparam, lparam)
  PROTECTED *hdr.NMHDR
  PROTECTED *di.NMLVDISPINFO
  
  IF msg = #WM_NOTIFY
    *hdr = lparam
    
    IF *hdr\code = #LVN_GETDISPINFO
      *di = lparam
      
      IF *di\item\iSubItem = 0
        str.i = @daten(*di\item\iItem)\ID
      ELSE
        str.i= @daten(*di\item\iItem)\Rnd
      ENDIF
            
      *di\item\pszText = str
      
      PROCEDURERETURN #True
    ENDIF
          
  ENDIF
  
  PROCEDURERETURN #PB_ProcessPureBasicEvents  
ENDPROCEDURE  

IF OpenWindow(0, 0, 0, 270, 140, "ListViewGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  SetWindowCallback(@Callback(), 0)
    
  ListIconGadget(0, 10, 10, 250, 120, "ID", 100, #LVS_OWNERDATA | #PB_ListIcon_FullRowSelect)
  AddGadgetColumn(0,1, "rnd", 60)
  
  SendMessage_(GadgetID(0), #LVM_SETITEMCOUNT, #item_count, 0)  
  
  REPEAT : 
    
  UNTIL WaitWindowEvent() = #PB_Event_CloseWindow
  
ENDIF

Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: Simpler 32/64-Bit-Dis-Assembler in PB

Beitrag von PureLust »

Helle hat geschrieben:Hat jemand eine schnellere Alternativ-Lösung parat? Ich könnte es direkt per ASM im Speicher verwalten, aber meine Zielstellung war eben, weitestgehend PB zu verwenden.
Hab mir jetzt nicht Deinen Source genau angeschaut ob Du's eventuell schon benutzt, aber beim Füllen eines ListIconGadgets mit vielen Zeilen
hilft das Abschalten des Redrawings per "SendMessage_(GadgetID(0),#WM_SETREDRAW,#False,0)" extrem.

Im nachfolgenden Beispiel verringert sich dadurch die Füllzeit eines ListIconGadgets() mit 20.000 Einträge von 23,5 Sek. auf rund 1 Sek.:

Code: Alles auswählen

DisableDebugger

OpenWindow(0,0,0,300,300,"test")
ListIconGadget(0,0,0,300,300,"Debugged Code ...", 296)
;SendMessage_(GadgetID(0),#WM_SETREDRAW,#False,0)
start= ElapsedMilliseconds()
For n = 1 To 20000
	AddGadgetItem(0,-1,Str(n))
Next
stop = ElapsedMilliseconds()
;SendMessage_(GadgetID(0),#WM_SETREDRAW,#True,0)
EnableDebugger

Debug stop - start
Repeat
	event = WaitWindowEvent()
Until event = #PB_Event_CloseWindow
Falls Du's für Linux etc. ohne API machen möchtest könntest Du das ListIconGadget für die Zeit auch hiden - hat den gleichen Beschleunigungseffekt.

Gruß .... und guten Rutsch, :allright:
PL.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Re: Simpler 32/64-Bit-Dis-Assembler in PB

Beitrag von Helle »

Hallo,
erstmal euch allen ein gesundes neues Jahr!
@PureLust: Das hatte ich schon drin; ohne kann man es gleich vergessen. Aber Danke!
@edel: Jaaa :bounce: ! Nachdem heute mein Hirn wieder Willens war, halbwegs koordiniert zu funktionieren, habe ich Deinen Tipp für erste Tests eingebaut und siehe da, der Speed-Gewinn hat ca. den Faktor 8 (!). Wird natürlich fest eingebaut. Vielen Dank :praise: !
Gruß
Helle
Antworten