Seite 1 von 1

PBOSL_AllocateMemoryGlobal()

Verfasst: 04.03.2012 12:17
von 7x7
Ich habe ein Programm "A" und ein Programm "B". Beide Programme sollen über einen gemeinsamen Speicher
Daten austauschen. Als gemeinsamer Speicher kommt aus Geschwindigkeits- und Verfügbarkeitsgründen nur
RAM in Frage.

In PBOSL gibt es die Lib "PBOSL_AllocateMemoryGlobal()". Leider wird - wie bei Amateuren so üblich- an
Anwendungsinformationen oder Examples mächtig gespart. Irgendwie muss der Lib-Programmierer davon
ausgegangen sein, dass seine Gedanken jeder lesen kann.

Wie muss ich die Funktion anwenden? Hat das schonmal jemand benutzt?

Re: PBOSL_AllocateMemoryGlobal()

Verfasst: 04.03.2012 12:23
von RSBasic
http://www.purebasic.fr/german/viewtopi ... 16#p139216
http://www.purebasic.fr/german/viewtopi ... 135#p44135

Ich weiß aber nicht, ob du diese zwei Beispielcodes bereits kennst. Für mich wären die zwei Beispiele bereits ausreichend.

Re: PBOSL_AllocateMemoryGlobal()

Verfasst: 04.03.2012 12:28
von ts-soft
Es sind doch 2 Beispiele im examples Ordner enthalten, IMHO mehr als genug um diese einfach Lib zu verstehen.
Hier mal meine Umsetzung (ohne UserLib):

Code: Alles auswählen

Define HandleMap

Procedure CreateSharedMemory(Name.s, Size)
  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

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

Procedure CloseSharedMemory(MemoryAddress)
  Shared HandleMap
  UnmapViewOfFile_(MemoryAddress)
  CloseHandle_(HandleMap)
EndProcedure
CreateSharedMemory(Name.s, Size):
Name: ein beliebieger String
Size: Grösse des Speichers

Andere Programme benötigen den Namen um den Speicher zu öffnen:
OpenSharedMemory(Name.s)

Mit CloseSharedMemory(MemoryAddress) wird das ganze geschlossen (erst nachdem die letzte Instance
es geschlossen hat, also nach einem Create und 3 Open, erst wenn diese alle geschlossen wurden.

Das Ergebnis der ersten beiden Funktionen ist die Speicheradresse, in die geschreiben werden kann.

Es empfiehlt sich, den Speicher zu strukturieren, wobei zu beachten ist, das dynamische Elemente nicht
genutzt werden können, also keine Strings, nur FixStrings, keine Arrays, List oder Maps.

Gruß
Thomas

Re: PBOSL_AllocateMemoryGlobal()

Verfasst: 05.03.2012 11:05
von 7x7
ts-soft hat geschrieben:Es sind doch 2 Beispiele im examples Ordner enthalten...
Examples? Wo? In der "pbosl_win.zip" garantiert nicht.
Und ausserdem: Wäre es nicht logischer (nomen est omen) Hilfe in der "Hilfe" anzubieten?

Danke RSBasic für die Links. Hat sich aber mit ts-softs Code erledigt.

Danke ts-soft für dein Code ohne User-Lib. Diese offene, einsehbare und jederzeit anpassbare Form ist mir
wesentlich lieber, als eine unwartbare, geschlossene Lib von irgendwo.

Edit by NicTheQuick:
Reaktionen auf diesen Beitrag befinden sich hier.

Re: PBOSL_AllocateMemoryGlobal()

Verfasst: 05.03.2012 11:38
von Bisonte
hmmmm auf der offiziellen PBOSL Seite http://www.purearea.net/pb/german/index.htm sind doch Examples....
Ganz rechts oben... in der gleichen Reihe wie die Libs selbst....