SharedMemory

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

SharedMemory

Beitrag von ts-soft »

Nachdem ich den Code hier nicht finden konnte, hab ich in nochmal
aufbereitet, da ich denke, der eine oder andere kann das gebrauchen.
Die Include: ("shared_memory.pbi")

Code: Alles auswählen

; PB 3.xx (mit kl. Anpassungen), PB 4.xx (evtl. sind nicht alle konstanten in allen Versionen deklariert)
; Windows only

Define HandleMap.l

; erstellt oder öffnet einen gemeinsamen benannten Speicher
; sollte der Speicher unter dem Namen bereits erstellt sein,
; so wird er geöffnet und Size wird ignoriert.
; dies entspricht dann OpenSharedMemory
Procedure AllocateSharedMemory(Name.s, Size.l)
  Shared HandleMap
  HandleMap = CreateFileMapping_(#INVALID_HANDLE_VALUE, 0, #PAGE_READWRITE|#SEC_COMMIT|#SEC_NOCACHE, 0, Size, @Name)
  If HandleMap
    ProcedureReturn MapViewOfFile_(HandleMap, #FILE_MAP_ALL_ACCESS, 0, 0, 0)
  EndIf
EndProcedure

; öffnet einen bereits erstellten benannten Speicher
Procedure OpenSharedMemory(Name.s)
  Shared HandleMap
  HandleMap = OpenFileMapping_(#FILE_MAP_ALL_ACCESS, 0, @Name)
  If HandleMap
    ProcedureReturn MapViewOfFile_(HandleMap, #FILE_MAP_ALL_ACCESS, 0, 0, 0)
  EndIf
EndProcedure

; gibt den Speicher für den aktuellen Process frei.
; erst wenn der letze Process den Speicher freigegeben
; hat, wird er endgültig freigegeben!
Procedure FreeSharedMemory(MemoryAddress.l)
  Shared HandleMap
  UnmapViewOfFile_(MemoryAddress)
  CloseHandle_(HandleMap)
EndProcedure
Beispiel Ersteller:

Code: Alles auswählen

EnableExplicit

XIncludeFile "shared_memory.pbi"

Structure myMem
  text.s{23}
  quit.l
EndStructure

; test
Define *mem.myMem = AllocateSharedMemory("MyMemory", SizeOf(myMem))

If *mem
  *mem\text = "Feel the ..Pure.. Power"
  
  While *mem\quit = #False
    Delay(100)
  Wend
  FreeSharedMemory(*mem)
  MessageRequester("MyMemory", "Client hat quit gesetzt")
EndIf
Beispiel Client:

Code: Alles auswählen

EnableExplicit

XIncludeFile "shared_memory.pbi"

Structure myMem
  text.s{23}
  quit.l
EndStructure

; test
Define *mem.myMem = OpenSharedMemory("MyMemory")

If *mem
  MessageRequester("MyMemory", *mem\text)
  
  *mem\quit = #True
  FreeSharedMemory(*mem)
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
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: SharedMemory

Beitrag von Kiffi »

@Thomas: Danke für den Code!

Ohne jetzt genau nachgesehen zu haben: Gibt es Vorteile, Nachteile,
Unterschiede zu GlobalSharedMemory in den PBOSL?

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

Vorteil:
-besser für Threadsicher/Unicode zu kompilieren
weil Includefile
-Einfacher umzustellen für die zukunft.

Nachteil:
mehr Code(wenn das überhaupt ein Nachteil iss)
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Rings hat geschrieben:Vorteil:
-besser für Threadsicher/Unicode zu kompilieren
weil Includefile
nur, wenn man die GlobalSharedMemory-LIB verwendet.
Nicht, wenn man den GlobalSharedMemory-Source einbindet ;-)

Grüße ... Kiffi
a²+b²=mc²
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

Beitrag von ts-soft »

Funktionell sind die Sourcen gleich. Ich denke meiner ist kürzer und ver-
ständlicher, aber das denke ich immer :mrgreen:
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
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

ts-soft hat geschrieben:Ich denke meiner ist kürzer und ver-
ständlicher, aber das denke ich immer :mrgreen:
Meine bessere Hälfte denkt genau anders herum
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Beitrag von 7x7 »

:mrgreen:
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

Tachchen habe mal n Frage dazu:

Wie sicher ist das lesen und schreiben in diesem SharedMemory?

Damit meine ich, ob es ohne weitere Sicherheitsmaßnahmen möglich ist das ein Programm "wann es will" rein schreibt und das andere "wann es will" rausließt.

Würde das zu einem Absturz führen ? (IMA)

Oder liefert das lesen einfach nur "unerwünschte" (also nicht ganz vollständige) Daten?
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
dige
Beiträge: 1236
Registriert: 08.09.2004 08:53

Beitrag von dige »

mmmh, wenn ich das richtig verstehe, wird hier einfach von 2 oder mehreren Programmen eine Datei geöffnet und über die Windows API in den Speicher gemappt...genial!
"Papa, ich laufe schneller - dann ist es nicht so weit."
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

Beitrag von ts-soft »

Wenn ich es richtig verstanden habe, ist es so, das wenn tatsächlich 2 oder
mehr gleichzeitig etwas ändern, sehen auch nur diese die Änderung.
Gibt also keine IMA aber falsche Ergebnisse.

Durch das ändern der Procedure könnte man auch die Rechte einschränken,
hab ich aber nicht berücksichtig, könnte es aber noch einbauen, falls
gewünscht.

gruß
Thomas
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
Antworten