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

Anfängerfragen zum Programmieren mit PureBasic.
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

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

Beitrag 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^^)
Signatur und so
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

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

Beitrag von mk-soft »

Arrays werden immer ByRef übergeben. auch an eine DLL.

Code: Alles auswählen

ProcedureDLL foo(*Daten, Type, Size)
  ...
  ProcedureReturn Erfolg
EndProcedure
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

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

Beitrag 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
Signatur und so
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

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

Beitrag 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.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

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

Beitrag 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.
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

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

Beitrag 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:
Signatur und so
Antworten