Seite 1 von 3

Beispiele zu neuen Funktionen PB5.10

Verfasst: 21.12.2012 18:22
von ts-soft
Da zur Zeit die neuen Funktionen noch nicht komplett dokumentiert sind, soll hier vorläufig eine kleine Sammlung
von Codeschnippseln entstehen.

Hier ein erstes Beispiel: Wir erstellen ein ZipArchiv im Tempordner, mit dem Namen myzip.zip und fügen eine
Textdatei aus dem SDK hinzu. Diese wird in das Unterverzeichnis SubDir1\SubDir2 gepackt.

Code: Alles auswählen

UseZipPacker(); Packerplugin bestimmen
CreatePack(0, GetTemporaryDirectory() + "myzip.zip") ; Archiv erstellen
AddPackFile(0, #PB_Compiler_Home + "SDK\CompilerInterface.txt", "SubDir1\SubDir2\CompilerInterface.txt") ; Datei hinzufügen
ClosePack(0) ; Archiv schliessen.
Hoffe auf rege Beteiligung :wink:

Re: Beispiele zu neuen Funktionen PB5.10

Verfasst: 21.12.2012 19:43
von STARGÅTE
Hier ein Beispiel zu PostEvent() und EventData():

In diesem Beispiel sendet zB ein Thread (oder eine andere Funktion von außen) ein Ereignis.
Außerdem kann ein eigener Data-Wert mitgesentet werden.

Code: Alles auswählen

Enumeration
	#Window
	#Gadget
	#Timer
EndEnumeration


Procedure Test(Null)
	Repeat
		Delay(500)
		PostEvent(#PB_Event_Gadget, #Window, #Gadget, #Null, Random(100))
	ForEver
EndProcedure

OpenWindow(#Window, 0, 0, 800, 600, "WindowTitle", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
	ButtonGadget(#Gadget, 10, 10, 200, 30, "Drück mich oder nicht ^^")

CreateThread(@Test(), #Null)

Repeat
	
	Select WaitWindowEvent(10)
			
		Case #PB_Event_CloseWindow
			End
			
		Case #PB_Event_Gadget
			Select EventGadget()
				Case #Gadget
					Debug "Ich wurde gedrückt und PostData war "+Str(EventData())
			EndSelect
		
	EndSelect
	
ForEver
Aktuell muss WaitWindowEvent() noch ein TimeOut haben, da das Event sonst nicht ankommt.

Re: Beispiele zu neuen Funktionen PB5.10

Verfasst: 21.12.2012 19:57
von STARGÅTE
Der lange gewünschte Befehl Bool() ist da, so erhält man eine echte Zahl (0 oder 1) für eine logische Aussage:

Code: Alles auswählen

Procedure Min(A, B)
	ProcedureReturn Bool(A<B)*A + Bool(A>=B)*B
EndProcedure

Debug Min(1,3)
Debug Min(-1,-3)
Debug Min(1,-3)
Debug Min(-1,3)

Re: Beispiele zu neuen Funktionen PB5.10

Verfasst: 21.12.2012 20:26
von STARGÅTE
Mit dem neuen Schlüsselwort UndefineMacro, sollte man nun Macros in einem Include am Ende auch immer wieder freigeben, sodass es nicht zu kollisionen kommt:

Code: Alles auswählen

Macro Str(Value)
  "Eigene Definition"
EndMacro

Debug Str(123)

UndefineMacro Str


Macro Str(Value)
  "Eine andere Definition: "+Hex(Value)
EndMacro

Debug Str(123)

UndefineMacro Str


Debug Str(123)

Re: Beispiele zu neuen Funktionen PB5.10

Verfasst: 21.12.2012 20:29
von ts-soft
ergänzend zu PostEvent()

Man kann auch eine eigene EventConstante definieren.

#MyEvent = -1000

und beim Select WaitWindowEvent dann Case #MyEvent

Welche Werte, damit es nicht mit vorhandenen Konstanten kollidiert, ist mir jetzt noch nicht bekannt,
aber minuswerte sollte man erstmal problemlos nutzen können.

Re: Beispiele zu neuen Funktionen PB5.10

Verfasst: 21.12.2012 20:53
von ts-soft
Hier noch ein weiteres Beispiel zu den Packfunktionen. Das mit dem erstem Beispiel erstellte Pack
wir im Speicher entzippt und in einem EditorGadget dargestellt. Dabei wird auch gleich die neue
Konstante #PB_Editor_WordWrap genutzt.

Code: Alles auswählen

UseZipPacker(); Packerplugin bestimmen
CreatePack(0, GetTemporaryDirectory() + "myzip.zip") ; Archiv erstellen
AddPackFile(0, #PB_Compiler_Home + "SDK\CompilerInterface.txt", "SubDir1\SubDir2\CompilerInterface.txt") ; Datei hinzufügen
ClosePack(0) ; Archiv schliessen.

Define *mem, size, name.s
If OpenPack(0, GetTemporaryDirectory() + "myzip.zip")
  If ExaminePack(0)
    NextPackEntry(0)
    name = PackEntryName(0)
    size = PackEntrySize(0)
  EndIf
EndIf

*mem = AllocateMemory(size)
If *mem
  OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "Unpack Test")
  EditorGadget(0, 0, 0, 640, 480, #PB_Editor_WordWrap | #PB_Editor_ReadOnly)
  
  UncompressPackMemory(0, *mem, size, name)
  SetGadgetText(0, PeekS(*mem, -1, #PB_Ascii))
  FreeMemory(*mem)
  ClosePack(0)
  
  While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend
EndIf

Re: Beispiele zu neuen Funktionen PB5.10

Verfasst: 21.12.2012 23:30
von CSHW89
Wow, #PB_Memory_NoClear ist ja mal der absolute Wahnsinn. Bekomme ein Verhältnis (clear/noclear) von 1300/50:

Code: Alles auswählen

#size = 65536
#n = 100000


time = ElapsedMilliseconds()
For i = 0 To #n-1
  *mem = AllocateMemory(#size)
  FreeMemory(*mem)
Next
time1 = ElapsedMilliseconds() - time


time = ElapsedMilliseconds()
For i = 0 To #n-1
  *mem = AllocateMemory(#size, #PB_Memory_NoClear)
  FreeMemory(*mem)
Next
time2 = ElapsedMilliseconds() - time


MessageRequester("Info", Str(time1)+"/"+Str(time2))
lg Kevin

Re: Beispiele zu neuen Funktionen PB5.10

Verfasst: 21.12.2012 23:57
von DrShrek
CSHW89 hat geschrieben:Bekomme ein Verhältnis (clear/noclear) von 1300/50:
Bei mir 390/15 (64bit)

Re: Beispiele zu neuen Funktionen PB5.10

Verfasst: 22.12.2012 00:03
von CSHW89
Ja mein Lapi ist ein Arbeits-PC, keine Rechenmaschine :mrgreen: . Aber erstaunlich ist, dass es bei anderen Größen des Speicherblocks andere Ergebnisse liefert, bei denen das Verhältnis fast 1:1 ist.

lg Kevin

Re: Beispiele zu neuen Funktionen PB5.10

Verfasst: 22.12.2012 00:42
von CSHW89
Hier noch ein kleines Beispiel mit direkt mal drei Neuerungen: "Define NewList", "PB_Memory_NoClear", aber vorallem "Array/List/Map parameter support to Interface methods":

Code: Alles auswählen

Interface MyList
  toPBList(List res.i())
EndInterface


Structure MyListObj
  *vTable
  value.i
  *nxt.MyNode
EndStructure


Procedure MyList_toPBList(*this.MyListObj, List res.i())
  While (*this <> #Null)
    AddElement(res())
    res() = *this\value
    *this = *this\nxt
  Wend
EndProcedure


Procedure NewMyList(value.i, *prev.MyListObj=#Null)
  Protected *this.MyListObj
  
  *this = AllocateMemory(SizeOf(MyListObj), #PB_Memory_NoClear)
  *this\vTable = ?MyListFunctions
  *this\value  = value
  *this\nxt    = #Null
  
  If (*prev <> #Null)
    *prev\nxt = *this
  EndIf
  
  ProcedureReturn *this
  
  DataSection
    MyListFunctions:
    Data.i @MyList_toPBList()
  EndDataSection
EndProcedure


Define *lst, *first.MyList

*first = NewMyList(1)
*lst = *first
*lst = NewMyList(2, *lst)
*lst = NewMyList(3, *lst)
*lst = NewMyList(4, *lst)
*lst = NewMyList(5, *lst)
*lst = NewMyList(6, *lst)

Define NewList pblst.i()

*first\toPBList(pblst())

ForEach pblst()
  Debug pblst()
Next
Funktioniert super :allright:

lg Kevin