LabVIEWForum.de
Übergabe eines Pointers - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: DLL & externer Code (/Forum-DLL-externer-Code)
+---- Thema: Übergabe eines Pointers (/Thread-Uebergabe-eines-Pointers)

Seiten: 1 2


Übergabe eines Pointers - Mr.T - 18.01.2007 11:17

Hallo!

Anbei mal ein Beispiel VI. Ich habe dem DLL Aufruf (Funktion erwartet u.A. einen Pointer) ein Numerisches Element aus einem Cluster zugewiesen. Die Funktion signalisiert über diesen Pointer, oder besser gesagt den Inhalt der Speicherstelle, einen Zustand.

Das heisst: Ich übergebe einen Pointer auf ein numerisches Bedienelement. Die Funktion sollte mittels des Pointers den Inhalt des Elemetns ändern, z.B. eine 1 hineinschreiben. Wacko

Da alle anderen DLL Aufrufe funktionieren, gehe ich davon aus, dass ich wohl falsch auf dieses Ereignis warte...:Blink

[attachment=4689]

Und hier das VI welches die Funktion aufruft:

[attachment=4690]

So, ich hoffe Ihr könnt mir da helfen...

Die LLB ist hier im Forum zu finden unter:

http://www.LabVIEWforum.de/index.php?showtopic=4511

Gruß und Dank!


Übergabe eines Pointers - IchSelbst - 18.01.2007 12:01

Laut diverser LV-Experten sind lokale Variablen alles Kopien. Wenn dem so ist, wird das mit dem Pointer nichts.

Frage:
Ist das Element in der While-Schleife nun eine Kopie mit eigenem Speicherbereich, oder zeigen alle "Variablen-Instanzen" auf ein und den selben Speicherbereich?


Übergabe eines Pointers - cb - 18.01.2007 13:45

' schrieb:Laut diverser LV-Experten sind lokale Variablen alles Kopien. Wenn dem so ist, wird das mit dem Pointer nichts.

Frage:
Ist das Element in der While-Schleife nun eine Kopie mit eigenem Speicherbereich, oder zeigen alle "Variablen-Instanzen" auf ein und den selben Speicherbereich?

weder noch ...
eine lokale Variable ist eigentlich eine Funktion, die entweder den Wert eines Controls verändern oder den Wert eines Controls lesen kann. Beim Schreiben wird automatisch das Frontpanel aktualisiert, damit der geschriebene Wert auch sichtbar ist. Mit Variablen im Sinne von Variablen in C/C++ hat das überhaupt nichts gemeinsam.

Die mit den Variablen in C/C++ vergleichbaren Elemente in LabVIEW sind die Drähte!

Was ichSelbst da nun macht ist: er prüft, ob ein Control auf dem Frontpanel einen bestimmten Wert hat. Wo dieser Wert nun herkommt ist dem Programm völlig wurschd. Das kann durch eine andere lokale Variable gesetzt worden sein, oder der User hat den Wert des Controls verändert, dabei wird immer der gerade aktuelle Wert gelesen. Wenn man nun schnell genug klicken kann, kann man durchaus den Wert einers Controls verändern, ohne dass die lokale Variable alle Änderungen mitbekommt ...

Ansonsten: in LV gibt es intern zwar durchaus Zeiger, aber die sind dem Benutzer nicht zugänglich noch in irgend einer anderen Art und Weise sichtbar. Die Aussage "Ich übergebe einen Pointer auf ein numerisches Bedienelement." ist also Quatsch.


Übergabe eines Pointers - IchSelbst - 18.01.2007 14:19

' schrieb:Die Aussage "Ich übergebe einen Pointer auf ein numerisches Bedienelement." ist also Quatsch.
Pointer auf z.B. Datenwerte zum Zwecke der externen Manipulation dieses Datenwertes gibt es also nicht - demzufolge kann man sie auch nicht an die DLL übergeben.

Mr.T, warum macht du nicht einfach anstelle des Variablenzugriffs einen DLL-Aufruf zum Lesen des Wertes?


Übergabe eines Pointers - Achimedes - 18.01.2007 17:36

Huhu,
ich glaube so wolltest du das haben?
Oder?
[attachment=4702]


Übergabe eines Pointers - cb - 18.01.2007 18:54

' schrieb:Pointer auf z.B. Datenwerte zum Zwecke der externen Manipulation dieses Datenwertes gibt es also nicht - demzufolge kann man sie auch nicht an die DLL übergeben.

Mr.T, warum macht du nicht einfach anstelle des Variablenzugriffs einen DLL-Aufruf zum Lesen des Wertes?

Wenn du die Call Library Node verwendest und einstellst, dass der Wert aus LabVIEW als Pointer übergeben werden soll, dann wird der Wert per Pointer übergeben. Einen "echten" Pointer kannst du in LV Blockdiagramm nicht erzeugen.

[attachment=4704]

Ich frag mich aber, was das nun mit der lokalen Variaben aus dem Bild zu tun hat ?Wacko


Übergabe eines Pointers - IchSelbst - 18.01.2007 19:05

' schrieb:Ich frag mich aber, was das nun mit der lokalen Variaben aus dem Bild zu tun hat ?
Soviel ich verstanden habe, will er folgendes machen:

In einem bestimmten DLL-Aufruf, z.B. ganz am Anfang des LV-Programmes, übergibt er einen Zeiger auf die Variable DAQ_HalfReady.Haldready (was ja gar nicht geht). Die DLL nun besitzt einen eigenen Prozessor-Thread, der mittels dieses Zeigers auf die Variable DAQ_HalfReady.Haldready schreiben wird. Im LV-Programm würde man dann alleine durch Abfragen dieser Variablen - siehe Bild - einen Status der DLL feststellen können, ohne die DLL selbst danach fragen zu müssen.


Übergabe eines Pointers - cb - 19.01.2007 07:20

' schrieb:Soviel ich verstanden habe, will er folgendes machen:

In einem bestimmten DLL-Aufruf, z.B. ganz am Anfang des LV-Programmes, übergibt er einen Zeiger auf die Variable DAQ_HalfReady.Haldready (was ja gar nicht geht). Die DLL nun besitzt einen eigenen Prozessor-Thread, der mittels dieses Zeigers auf die Variable DAQ_HalfReady.Haldready schreiben wird. Im LV-Programm würde man dann alleine durch Abfragen dieser Variablen - siehe Bild - einen Status der DLL feststellen können, ohne die DLL selbst danach fragen zu müssen.

ahso ... äh, ja ... das geht natürlich nicht. Wenn, dann muss man die DLL pollen ...


Übergabe eines Pointers - Mr.T - 21.01.2007 18:11

Hallo!

Erholt vom WE und dem Usertreff (wo ich dann doch einige hier aus dem Thema hier vermisst habeWink) kann ich mich nun wieder meiner Frgaestellung widmen (Sorry dafür!). Rolleyes

Es geht mir um folgendes:
Die Funktion HalfReady() soll mittels des übergebenen Pointers signalisieren, dass Daten zum abholen bereit sind. Also würde ich in C einfach den Pointer übergeben, um der Funktion zu ermöglichen, mir irgendwie mitzuteilen, dass die Daten bereit zum abholen sind. Nämlich, in genau dieser übergebenen Speicherstelle (Pointer). Die DLL Funktion HalfReady() sollte den Wert, auf den der Pointer zeigt, verändern und somit mitteilen, dass ich was tun muß, um die Daten zu erhalten. Das sollte die while(HalfReady!=0) - Schleife andeuten.

Da Ihr jetzt schon so fleißig diskutiert habt, merke ich, dass ich das so garnicht realisieren kann. Die Frage bleibt nun: Wie dann?

Die DLL Funktion Teilt mir nunmal über den Inhalt der übergebenen Pontervariablen mit, dass ich was tun muß...Sad
Was meint Ihr dann mit "DLL Pollen"?

Gruß und DANK!

Edit:
Die lokale Variable habe ich eingefügt, da das Bedienelement dazu weiter vorne im Programm verwendet wird - nur Optik. In diesem Bedienelement gibt es das Element "HalfReady", welches durch die DLL also verändert werden hätte sollen. klar, ich kann auch direkt das Bedienelement anschliessen, aber wie ich Euch verstehe, hätte das auch nichts gebracht. Das Zweite Element des Clusters (Bedienelementes) ist der andere Übergabeparameter der HalfReady(Pointer, 2.Parameter), auf welchem eingegeben wird, auf welche "id", also DAQ-Karte sich der DLL-Aufruf bezieht....


Übergabe eines Pointers - IchSelbst - 21.01.2007 19:14

' schrieb:Die DLL Funktion Teilt mir nunmal über den Inhalt der übergebenen Pontervariablen mit, dass ich was tun muß
Dieses Verfahren (das quasi einem Callback entspricht nur ohne Programm) ist aber nicht verträglich mit LV. Mit anderen Worten: Das geht nicht (zumindest bisher, bis ich den Rest ausprobiert habe).

Zitat:Was meint Ihr dann mit "DLL Pollen"?
Na, pollen halt - zyklisch nachfragen: DLL, hast du was für mich? DLL, hast du was für mich? DLL, hast du was für mich? DLL, hast du was für mich? (usw)

Zitat:klar, ich kann auch direkt das Bedienelement anschliessen, aber wie ich Euch verstehe, hätte das auch nichts gebracht.
Das bringt auch nichts: Am DLL-Knoten ist nämlich niemals ein Bedien/Anzeigeelement angeschlossen - sondern immer ein Draht, also eine ganz spezielle Datenkopie.

Hast du mal die Möglichkeit Callback angedacht?

Fazit:
Bis jetzt steht's schlecht aus.