Datenaustausch zw. Exen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Datenaustausch zw. Exen

Beitrag von monta »

Folgendes Problem, ich möchte die Möglichkeit, zwischen zwei Exen daden austauschen zu können.

Hintergrund: Exe1 als Hauptprogramm ruft Exe2 mit Parameter auf. Anschließend erledigt Exe2 , welche ebenfalls über eine Gui verfügt, ihre zugedachten Aufgaben und liefert die entsprechenden Daten zurück.
Dabei erfolgt in der zweiten Exe allerdings wie schon angedeutet ebenfalls eine Benutzereingabe über die GUI.

Aufruf ist ja kein Problem, nur die Rückgabe der Daten.

Mein theoretischer Ansatz ist der, Exe1 erstellt einen MemoryStream und übergibt einen Zeiger auf diesen an Exe2 beim Aufruf. Anschließend kann Exe zwei die ausgegebenen Daten in diesen Stream schreiben und Exe1 kann anschließend darauf zugreifen.

Ist das ein gangbarer Weg?

Das Problem, was ist wenn Exe2 mehrer 'Dateien' n den Stream schreibt, woher soll die Exe1 dann wissen, wo die Daten anfangen und enden? Also müsste ich ja theoretisch noch die Streampositionen übergeben, aber wie?

Ich hab mir schon überlegt, zusätzlich über die Konsole zu gehen um dort noch Kommandos über die Pipe austauschen zu können, die ich ja bei nem Aufruf über TProcess einfach auslesen kann. Folglich könnte ich darüber noch Steuerkommandos für die Streamverarbeitung übergeben.
Gibts ne bessere Alternativ, außer die Daten als File zwischenzuspeichern?
Johannes

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Freepascal liefert hierfür wie könnte es anders sein eine schöne Plattformunabhängige Möglichkeit...

nennt sich simpleipc und unterstützt auch mehrere Möglichkeiten für die interprozess Kommunikation die man einstellen kann.

Wenn du das ganze eventuell wie ein pluginsystem betreiben willst würd ich mir aber mal überlegen TCP/IP zu nehmen ein besser dukumentiertes system zur kommunikation gibt es nicht ich versteh schon lange nicht mehr warum z.b. office pakete das nicht einfach nutzen statt dessen werden irgendwelche plattformabhängigen und krummen wege gegangen siehe open office z.b.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Also SimpleIPC klingt ja wirklich gut, wenn man nur schnell nen paar Strings übergeben will. Vielleicht mach ich es auch nur darüber, und dann entsprechend die Binärdaten doch über Datei, dann könnte ich ja einwandfrei alle benötigten Infos und Kommandos als String übergeben.

Ich geb ja zu, das mich TCP/IP als Kommunikationsweg etwas abschreckt, weil es mir doch recht komplex vorkommt, und vielleicht etwas übertrieben umfangreich. Auf der anderen Seite hast du natürlich recht, was ausgereifteres System ist schwer zu finden. Man muss es halt nur in die eigene Anwendung entsprechend integrieren. Außerdem hätte man immer die Möglichkeit, das ganze mit Netzwerkfähigkeiten zu erweitern.

Was würdest du für die TCP-Geschichte nehmen? Die Sockets?
Johannes

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6857
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Pipes in Verbindung mit IPC.

IPC als Steuerkanal, Daten über Pipes.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Ich hab nur keinerlei Ahnung von Pipes, außer das ich die Konsole beim TProcess auslese hab ich damit noch nichts gemacht und mir fehlt der Ansatz wie das gehen soll.
Meinst du über die pipes-Unit der FCL?
Johannes

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6857
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Ja.

Pipes und Dateien haben eine Ähnlichkeit. Du arbeitest ähnlich wie mit Dateien.

Zum steuern verwendst Du IPC.

Beispiel: Du willst Daten senden, also bereitest du die Pipes vor und über IPC sendest du die nötige Info und zugleich das Startsignal. Dann werden die Daten über die Pipes übertragen und per IPC das ack gemacht. Denn die Pipes nur zu verwenden, macht Probleme, da du da leicht in Blocking gehst. Außerdem lässt sich IPC meist gut mit Ereignisgesteuert vereinbaren. Die Pipes nicht, da müsstest du permanent pollen.
Die Kombination aus beiden ist sehr effizient. Ich habe es nur unter Lazarus noch nicht gemacht, aber es wäre eine Herausforderung.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

SimpleIPC kann auch über pipes arbeiten hat aber auch speicherbasierte kanäle soweit ich weiss, gibts pipes auf jedem OS ?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Ich frage mich ja, wie ich z.b. auf Pipes reagieren kann. z.b. ich mache folgende anweisung im Terminal:
ls *|grep test
macht das die shell auto. oder ist das das worüber ihr gerade spriecht ?
MFG
Michael Springwald

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6857
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Christian hat geschrieben:SimpleIPC kann auch über pipes arbeiten hat aber auch speicherbasierte kanäle soweit ich weiss, gibts pipes auf jedem OS ?
Im Prinzip ja, bei Windows ist er erst mit NT möglich den Server zu spielen. Bei *nix und OS/2 ist das Standard (vor dem ganzen TCP/IP) gewesen. Win CE etc. zumindest passiv.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Naja, WinCE ist mir da relativ egal für mein vorhaben. Und auf nicht-NT wirds auch nicht eingesetzt werden.

Irgendwie stellt sich mir schon dir Frage, wie die beiden Exen die Pipe finden sollen um auch Ihre Daten in die gleiche Röhre zu blasen :lol: .
Ich muss mir mal die Unit anschauen und werd mal ein bisserl damit rumspielen.
Johannes

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6857
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Habe mir die gerade angesehen, ist relativ vereinfacht, als nur für Datenaustausch am Rechner. Kann sein, das es sonst zu Betriebssystemspezifisch wird.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

ich wollte sowas immer mit einer zwischen Datei lösen. Das zweite Programm schreibt in einer Datei irgendwas rein und sendet eine Goable Botschaft das vom Ersten Programm emfangen wird.

Bin nur nie dazu gekommen bis jetzt. Aber evlt. währe das ja die einfachste Möglichkeit. Das Problem hier bei ist ja nur das du eine allgemeine Botschaft senden müsstes das von deiner Anwendung verstanden wird.
MFG
Michael Springwald

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Ganz oben steht...ohne Datei.

Und ich brasuch keine globale Nachricht, sondern letztlich nur nen einheitlichen Dateinamen den beide Progs wissen, und über TProcess waitonexit kann ich warten und anschließend die Datei wieder einlesen und damit die Hauptanwendung nicht einfriert schnell noch das ganze in nen Thread, aber wie gesagt, soetwas ist zwar kein Problem, aber ich will es nicht über ne Datei machen.


Bei ICP, sobald der Server läuft und die Global-Eigenschaft auf true steht, kann sich doch theoretisch ne zweite Exe über einen Clienten, bei dem die entsprechende ServerID und ServerInstance gesetzt ist, verbinden, oder fehlt da noch was?
Johannes

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6857
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Pipes und IPC sind normalerweise 1:1. ENtweder mit Threads abspalten oder serialisieren.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Nein, sollte so gehn ist ja auch n kleines Beispiel dabei damit hatte ich damals auch angefangen. Pipes und IPC sind nicht das gleiche. Pipes sind eine IPC Technik es gibt aber noch viele andere.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Antworten