Seite 1 von 1

(statisches) Array an (nicht PB) DLL übergeben?

Verfasst: 11.04.2013 22:08
von Derren
Hi, Leute.
Ich könnte einfach rumprobieren, aber irgendwie kommt es mir so vor, als ob es immer noch eine weitere Fehlerquelle geben könnte...

Also, ich möchte ein Array (da komplett statisch (Anzahl und Größe der Einträge vorher bekannt), kann es sich um einen Speicherblock fester Größe handeln) an eine DLL übergeben, wobei die DLL nicht mit PB geschrieben sein muss.

Was wäre die beste Vorgehensweise?
Speicher reservieren und Pointer übergeben? - Allerdings passiert diese "Übergabe" ziemlich oft (10-20 mal pro Sekunde). Jedesmal ein paar Kb zu reservieren, freigeben scheint eher kontra-produktiv zu sein. Ich stelle mir dann einen "fragmentierten Ram" vor, falls es sowas gibt.

Und überhaupt, müsste dann die DLL nicht den Speicher freigeben, wenn alle Daten verarbeitet wurden? Geht das überhaupt, denn der Speicher wurde ja vom Hauptprogramm reserviert.
Oder kann man aus der DLL eine Prozedur im Hauptprogramm aufrufen, die den Speicher freigibt?

Eine andere Idee wäre einfach den 5- oder 10-fachen Speicherbereich zu reservieren und innerhalb dieses Bereichs "herumspringen" (*buffer + n * arraySize.i)
Somit müsste wenigstens nicht ständig neuer Speicher reserviert und freigegeben werden, sondern nur einmal bei Programmstart reservieren und bei Programmende freigeben.

Aber wie stelle ich dann sicher, dass nicht gleichzeitig geschrieben und gelesen wird?
Ich weiß nicht ob das für das Programm ein Problem ist (IMA), nehme es aber einfach mal an. Selbst wenn nicht, kann das zu unschönen Ergebnissen führen (wenn man sich den Datenstream als Video vorstellt, wären das Pixelfehler).

Und was ist mit Threads? "Threadsave" hat ja wohl auf externe DLLs keinen Einfluss, oder doch?

Fragen über Fragen, ich hoffe es hat jemand eine Antwort :lamer:

PS: Nein, es gibt keine Doku von der externen DLL, weil die gar nicht existiert. Die DLL soll eine Plugin sein, das von meinem Programm mit dem Array versorgt wird und mit diesen Daten dann macht was es will (z.B. visualisieren, oder über's Netzwerk versenden, was auch immer^^)

Re: (statisches) Array an (nicht PB) DLL übergeben?

Verfasst: 13.04.2013 14:02
von mk-soft
Arrays werden immer ByRef übergeben. auch an eine DLL.

Code: Alles auswählen

ProcedureDLL foo(*Daten, Type, Size)
  ...
  ProcedureReturn Erfolg
EndProcedure

Re: (statisches) Array an (nicht PB) DLL übergeben?

Verfasst: 14.04.2013 19:59
von Derren
Ich habe zwar keine Ahnung, wie man ein PB Array mit deinem Schnipsel verwendet (oder woher ein C++ Programmierer wissen soll, wie er ein PB-Array verwursten soll), aber das ist ja auch egal.
Ich wollte ja kein PB-Array nutzen, sondern einfach einen Speicherblock. So z.B.

Code: Alles auswählen

Define *buffer = AllocateMemory(256)
*buffer = ?myArray

Macro readArray( _buffer, _index )	
	PeekI(_buffer + (_index-1) * SizeOf(Integer))
EndMacro 

Debug readArray(*buffer, 17) ;should be 17
Debug readArray(*buffer, 29)  ;should be 29

DataSection 
	myArray:
	Data.i 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
	Data.i 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
	Data.i 21, 22, 23, 24, 25, 26, 27, 28, 29, 30
EndDataSection

Also, wenn ich ein "normales" Array verwenden würde, würde sich ja die Speicheradresse nie ändern (außer bei ReDim).
Eigentlich möchte ich bloß wissen, ob es beim gleichzeitigen Zugriff (Programm schreibt, DLL liest ausschließlich) irgendwelche Probleme (IMA) geben könnte.

Wie gesagt wird das Array mehrmals pro Sekunde neu befüllt. Allerdings habe ich keinen Einfluss auf die DLLs, die andere Leute schreiben.
Wenn mein Hauptprogramm also 10 mal pro Sekunde schreibt ( Delay(100))
und die ProcedureDLL so aussieht, dann wird ja gelesen, während mein Programm schreibt, obwohl ich die Prozedur erst nach Beenden des Schreibvorgangs aufgerufen habe.

Code: Alles auswählen

ProcedureDLL (index.i)
    Delay(100)
    PeekI(*buffer + index)
EndProcedure

Re: (statisches) Array an (nicht PB) DLL übergeben?

Verfasst: 14.04.2013 20:09
von mk-soft
Dann muss die DLL mechanismen bereitstellen wann auf das Array zugegriffen werden darf.
Ausserdem muss die DLL eine Beschreibung haben wie das Array auszusehen hat und wie die Parameter dazu sind.
In PB sind Arrays immer ein zusammenhängender Block. (Ausser LinkedList, Maps)

Ohne weiter genaueren Beschreibung der DLL kann man nur weiter raten.

Re: (statisches) Array an (nicht PB) DLL übergeben?

Verfasst: 14.04.2013 20:17
von NicTheQuick
Du meinst diese DLLs, von denen du redest, starten einen eigenen Thread, der unabhängig von deinem PB-Programm läuft und somit jeder Zeit auf das Array zugreifen kann, auch wenn du gerade am Schreiben bist?
Speicherzugriffsfehler wird es bei sowas jedenfalls nie geben. Jeder Thread kann auf einen allozierten Speicherbereich immer lesend oder schreibend zugreifen. Möchte man aber immer konsistente Daten haben in einem Array, dann braucht man Locks, also z.B. 'CreateMutex()' bei PB.

Re: (statisches) Array an (nicht PB) DLL übergeben?

Verfasst: 14.04.2013 20:50
von Derren
mk-soft hat geschrieben:Ohne weiter genaueren Beschreibung der DLL kann man nur weiter raten.
Die DLLs sollen ja erst später geschrieben werden. Als Plugins für ein Programm, an welchem ich arbeite.


@NicTheQuick, ok. Danke dir! :praise: