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