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

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

. 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
lg Kevin