Beispiele zu neuen Funktionen PB5.10

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
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beispiele zu neuen Funktionen PB5.10

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Beispiele zu neuen Funktionen PB5.10

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Beispiele zu neuen Funktionen PB5.10

Beitrag 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)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Beispiele zu neuen Funktionen PB5.10

Beitrag 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)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Beispiele zu neuen Funktionen PB5.10

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Beispiele zu neuen Funktionen PB5.10

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Beispiele zu neuen Funktionen PB5.10

Beitrag 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
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Re: Beispiele zu neuen Funktionen PB5.10

Beitrag von DrShrek »

CSHW89 hat geschrieben:Bekomme ein Verhältnis (clear/noclear) von 1300/50:
Bei mir 390/15 (64bit)
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Beispiele zu neuen Funktionen PB5.10

Beitrag 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
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Beispiele zu neuen Funktionen PB5.10

Beitrag 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
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Antworten