Seite 1 von 1
SharedMemory Crossplattform
Verfasst: 28.12.2013 18:53
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
Re: SharedMemory Crossplattform
Verfasst: 28.12.2013 19:29
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
Re: SharedMemory Crossplattform
Verfasst: 28.12.2013 19:44
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
Re: SharedMemory Crossplattform
Verfasst: 28.12.2013 20:26
von ts-soft
Ansonsten hier noch ein paar Infos:
http://en.wikipedia.org/wiki/Mmap
Re: SharedMemory Crossplattform
Verfasst: 28.12.2013 21:36
von Micha122
Hi Thomas,
auf Wiki habe ich natürlich als erstes nach mmap gesucht.
Neugierig gemacht hast Du mich auf alle fälle damit, zumal es das für Windows und Mac gibt.
Meine schnelle Networklösung gefällt mir eigentlich nicht wirklich, weil auf Windows sofort Firewall und Antiviren- Software drauf anspringen.
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
Re: SharedMemory Crossplattform
Verfasst: 29.12.2013 12:46
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.
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
Re: SharedMemory Crossplattform
Verfasst: 29.12.2013 16:52
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

Re: SharedMemory Crossplattform
Verfasst: 29.12.2013 17:40
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

Re: SharedMemory Crossplattform
Verfasst: 29.12.2013 18:50
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.
Trotzdem, danke für den aktuelleren Code.
Gruß, Micha122
Re: SharedMemory Crossplattform
Verfasst: 02.01.2014 15:10
von dige