Datenaustausch zw. Exen
-
- 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
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?
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
-
- 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:
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.
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/
-
- 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:
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?
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
- 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:
Pipes in Verbindung mit IPC.
IPC als Steuerkanal, Daten über Pipes.
IPC als Steuerkanal, Daten über Pipes.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
- 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:
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.
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).
- 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:
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.Christian hat geschrieben:SimpleIPC kann auch über pipes arbeiten hat aber auch speicherbasierte kanäle soweit ich weiss, gibts pipes auf jedem OS ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- 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:
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
.
Ich muss mir mal die Unit anschauen und werd mal ein bisserl damit rumspielen.
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

Ich muss mir mal die Unit anschauen und werd mal ein bisserl damit rumspielen.
Johannes
- 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:
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).
-
- 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)
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.
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
Michael Springwald
-
- 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:
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?
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
- 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:
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).