SharedMemory Crossplattform

Für allgemeine Fragen zur Programmierung mit PureBasic.
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

SharedMemory Crossplattform

Beitrag von Micha122 »

Hallo PB- Gemeinde,
Zwecks Datenaustausch mehrerer Programme untereinander suche ich eine Sharedmemory Lösung die CrossOS funktioniert.

Habe da zwar schon was in PBOSL gefunden, ist aber glaube ich nur für Windows.

Gruß, Micha122
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: SharedMemory Crossplattform

Beitrag von ts-soft »

Ungefähr dieselbe Funktionalität wie SharedMemory unter Windows bietet mmap_() unter Linux (funktioniert
evtl. sogar unter MacOS).
Hab da bisher aber noch keine Beispiele für PB gesehen, mußte Dir wohl selber erarbeiten.

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
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: SharedMemory Crossplattform

Beitrag von Micha122 »

@ts-soft
Habe mir schon fast gedacht, das es da CrossOS wohl nichts gibt.

Für mmap fehlt mir momentan leider die Zeit, werde deshalb wohl sicherlich den Datenaustausch mit den Network- Befehlen realisieren.

Gruß, Micha122
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: SharedMemory Crossplattform

Beitrag von ts-soft »

Ansonsten hier noch ein paar Infos: http://en.wikipedia.org/wiki/Mmap
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
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: SharedMemory Crossplattform

Beitrag von Micha122 »

Hi Thomas,
auf Wiki habe ich natürlich als erstes nach mmap gesucht. :wink:
Neugierig gemacht hast Du mich auf alle fälle damit, zumal es das für Windows und Mac gibt. :allright:

Meine schnelle Networklösung gefällt mir eigentlich nicht wirklich, weil auf Windows sofort Firewall und Antiviren- Software drauf anspringen. :cry:

Mal schauen, vielleicht mach ich unter Windows mit PBOSL_GlobalSharedMemory und unter Linux mit mmap. Muss mir das erst mal genau überlegen.

Nachtrag: Habs erst grade gesehen.... Herzlich Glückwunsch zum Geburtstag!

Gruß, Micha122
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: SharedMemory Crossplattform

Beitrag von Micha122 »

Also unter Windows klappt das ja ganz einfach.

Hier mal ein Beispiel bestehen aus 2 Codes:

Code: Alles auswählen

; 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


;Eigener Code zum testen
OpenConsole()
*result = AllocateSharedMemory("test", 1000)

PrintN("Speicheradress:        " + Str(*result))
PokeI(*result, 3433)
PrintN("Speicherinhalt:        " + Str(PeekI(*result)))
Input()

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


;Eigener Code zum testen
*result = OpenSharedMemory("test")

Debug "Speicheradresse:     " + Str(*result)
Debug "Speicherinhalt:      " + Str(PeekI(*result))

Die Prozeduren habe ich irgendwo hier im Forum gefunden und klappen einwandfrei. Selbst die API Befehle sind mit ein bisschen Google verständlich. Zumal Windows PB auch noch alle Konstanten kennt.

Unter Linux mit der Funktion mmap() sieht es in PB leider sehr dünne aus, bzw. allgemein im Strukturbetrachter. :cry:
PB kennt da noch nicht mal die Konstanten und ich kann kein C, weshalb mir die meisten Webseiten zu mmap nicht viel bringen.
Ohne Hilfe werde ich mmap() sicherlich nicht hinkriegen und deswegen nachher mal hier im Linux Forum einen Thread auf.

Gruß, Micha122
Barcodes for PureBasic - http://micha122.bplaced.net/
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: SharedMemory Crossplattform

Beitrag von Bisonte »

man beachte, daß wenn ein x64 Kompilat funktionieren soll, zumindest "Handles" wie in dem Fall das MapHandle,
immer als Integer zu deklarieren.

Also statt : Define HandleMap.l ein Define HandleMap.i oder einfach das .l weglassen, da Integer der Standardtyp ist.

Ansonsten gibt es mit x64 Kompilaten oft Probleme, weil eine 64 Bit Adresse nunmal nicht in eine 32Bit Schublade passt ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
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: SharedMemory Crossplattform

Beitrag von ts-soft »

Das ist das Problem, das alte Soucen hier nicht verschwinden, weiß gar nicht, wo er das ausgegraben hat.
Aktuelle Version sieht so aus:

Code: Alles auswählen

DeclareModule FileMap
  Declare Create(Name.s, Size.i)
  Declare Open(Name.s)
  Declare Close(*Mem)
EndDeclareModule

Module FileMap
  EnableExplicit
  
  Global hMap.i
  
  Procedure Create(Name.s, Size.i)
    hMap = CreateFileMapping_(#INVALID_HANDLE_VALUE, 0, #PAGE_READWRITE | #SEC_COMMIT | #SEC_NOCACHE, 0, Size, @Name)
    If hMap
      ProcedureReturn MapViewOfFile_(hMap, #FILE_MAP_ALL_ACCESS, 0, 0, 0)
    EndIf    
  EndProcedure
  
  Procedure Open(Name.s)
    hMap = OpenFileMapping_(#FILE_MAP_ALL_ACCESS, 0, @Name)
    If hMap
      ProcedureReturn MapViewOfFile_(hMap, #FILE_MAP_ALL_ACCESS, 0, 0, 0)
    EndIf
  EndProcedure
  
  Procedure Close(*Mem)
    UnmapViewOfFile_(*Mem)
    CloseHandle_(hMap)  
  EndProcedure
  
EndModule
Bin mir sicher, die schon irgendwo veröffentlicht zu haben :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
Micha122
Beiträge: 248
Registriert: 02.10.2011 14:45
Wohnort: Sinzig
Kontaktdaten:

Re: SharedMemory Crossplattform

Beitrag von Micha122 »

ts-soft schrieb:
Das ist das Problem, das alte Soucen hier nicht verschwinden, weiß gar nicht, wo er das ausgegraben hat.
Kann auch sein das der aus einem alten Source- File ist. :oops:

Trotzdem, danke für den aktuelleren Code.

Gruß, Micha122
Benutzeravatar
dige
Beiträge: 1247
Registriert: 08.09.2004 08:53

Re: SharedMemory Crossplattform

Beitrag von dige »

"Papa, ich laufe schneller - dann ist es nicht so weit."
Antworten