AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Kommunikation zwischen zwei Delphiprogrammen
Thema durchsuchen
Ansicht
Themen-Optionen

Kommunikation zwischen zwei Delphiprogrammen

Ein Thema von rwb · begonnen am 26. Nov 2022 · letzter Beitrag vom 17. Nov 2023
Antwort Antwort
Benutzerbild von rwb
rwb

Registriert seit: 28. Nov 2007
Ort: Tarmstedt
42 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Kommunikation zwischen zwei Delphiprogrammen

  Alt 28. Nov 2022, 17:40
Hallo,
Ihre Lösung gefällt mir, ich könnte eine Textdate mit den Daten auf jeweils einer Zeile anlegen. Die Datei hätte mehrere Zeilen. Damit wäre auch eine Batchverarbeitung möglich. Dabei geht es mir dann auch nicht um Schnelligkeit.
Aber hier liegt der Haken:
>Programm 1 schreibt seine Daten, die berechnet werden sollen, in Verzeichnis A, Programm 2 wartet darauf, dass in Verzeichnis A Dateien angelegt werden,
Es ist das warten von Programm 2, also die Überwachung eines Verzeichnisses. Ich habe einen ziemlichen Teil des Sonntags damit verbracht dafür eine praktikable Lösung zu suchen. Hier in der Delphi-Praxis gibt es eine ganze Reihe von Beiträgen zu diesem Thema. Aber sie sind ziemlich alt mit Verweisen auf Webseiten die nicht mehr existieren mit anderen gebrochenen Links und Beiträgen die Probleme aufzeigen aber keine Lösung.
In der JCVL gibt es die Komponenten JvChangeNotify und TJvFolderMonitor. Leider brach die Installation der JXVL mit einem Fehler ab.
Hiermit komme ich also zur Zeit auch nicht weiter. Es gibt eine Watch_it.exe die Verzeichnisse überwacht und Aktionen auslöst. Ich brauch aber eine Unit oder Komponente die ich einbinden kann.
Wie haben Sie das gelöst?

>Man darf sich nur nicht von irgendwem erwischen lassen, dass man so eine simple Lösung verwendet statt irgendeines "Frameworks" oder einer Datenbank (wobei die >schon Old School sind) oder eines "Microservices".
Da habe ich keine Angst
Mit besten Grüßen
RWB
Das Leben ist Freude
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.094 Beiträge
 
Delphi 12 Athens
 
#2

AW: Kommunikation zwischen zwei Delphiprogrammen

  Alt 28. Nov 2022, 19:15
Hallo,
Ihre Lösung gefällt mir, ich könnte eine Textdate mit den Daten auf jeweils einer Zeile anlegen. Die Datei hätte mehrere Zeilen. Damit wäre auch eine Batchverarbeitung möglich. Dabei geht es mir dann auch nicht um Schnelligkeit.
Aber hier liegt der Haken:
>Programm 1 schreibt seine Daten, die berechnet werden sollen, in Verzeichnis A, Programm 2 wartet darauf, dass in Verzeichnis A Dateien angelegt werden,
Es ist das warten von Programm 2, also die Überwachung eines Verzeichnisses. Ich habe einen ziemlichen Teil des Sonntags damit verbracht dafür eine praktikable Lösung zu suchen. Hier in der Delphi-Praxis gibt es eine ganze Reihe von Beiträgen zu diesem Thema. Aber sie sind ziemlich alt mit Verweisen auf Webseiten die nicht mehr existieren mit anderen gebrochenen Links und Beiträgen die Probleme aufzeigen aber keine Lösung.
In der JCVL gibt es die Komponenten JvChangeNotify und TJvFolderMonitor. Leider brach die Installation der JXVL mit einem Fehler ab.
Hiermit komme ich also zur Zeit auch nicht weiter. Es gibt eine Watch_it.exe die Verzeichnisse überwacht und Aktionen auslöst. Ich brauch aber eine Unit oder Komponente die ich einbinden kann.
Wie haben Sie das gelöst?

>Man darf sich nur nicht von irgendwem erwischen lassen, dass man so eine simple Lösung verwendet statt irgendeines "Frameworks" oder einer Datenbank (wobei die >schon Old School sind) oder eines "Microservices".
Da habe ich keine Angst
Mit besten Grüßen
RWB
Ja, in der JVCL gibt's was. Das nutzt intern m.W. irgendwelche Windows APIs, du könntest das also von deren Quellcode abgucken.
Aber: bei einer fehlgeschlagenen JVCL Installation werden wir dir da nur weiterhelfen können, wenn du uns die Fehlermeldung nennst. Wir haben leider keine Glaskugeln...
Hast du zuerst die JCL installiert?
Wie bist du zur Installation vorgegangen? Via Tools/GetIt Packagemnager?
  Mit Zitat antworten Zitat
Benutzerbild von rwb
rwb

Registriert seit: 28. Nov 2007
Ort: Tarmstedt
42 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Kommunikation zwischen zwei Delphiprogrammen

  Alt 28. Nov 2022, 21:58
Moin

>Hast du zuerst die JCL installiert?
>Wie bist du zur Installation vorgegangen? Via Tools/GetIt Packagemnager?
Ja, genau Tools/GetIt Packagemaneger, glücklicherweise hatte ich direct einen Screenshot gemacht. Ist angehängt.
Danach habe ich mir heruntergeladen:
JVCL349CompleteJCL27-Build5676.zip https://sourceforge.net/projects/jvcl/ und
https://github.com/project-jedi/jvcl jvcl-master.zip
aber damit komme ich nicht klar.
Angehängte Grafiken
Dateityp: jpg getIt error ics.JPG (63,0 KB, 28x aufgerufen)
Das Leben ist Freude
  Mit Zitat antworten Zitat
Benutzerbild von rwb
rwb

Registriert seit: 28. Nov 2007
Ort: Tarmstedt
42 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Kommunikation zwischen zwei Delphiprogrammen

  Alt 28. Nov 2022, 22:09
Korrektur,
inzwischen konnte ich die jvcl von der jvcl-master.zip installieren.
Das Leben ist Freude
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
483 Beiträge
 
#5

AW: Kommunikation zwischen zwei Delphiprogrammen

  Alt 28. Nov 2022, 19:48
>Man darf sich nur nicht von irgendwem erwischen lassen, dass man so eine simple Lösung verwendet statt irgendeines "Frameworks" oder einer Datenbank (wobei die >schon Old School sind) oder eines "Microservices".
Da habe ich keine Angst
Wenn du keine schnelle Reaktionszeit benötigst, merke dir das letzte Änderungsdatum der Datei und dann polle darauf. Dafür reicht ein Timer. Ja, ich würde einen Microservice schreiben, weil das in mORMot auch nicht viel mehr Arbeit ist, als FileAgeToDateTime aufzurufen. Irgendwann kommt immer einer auf die Idee und die Berechnungen sollen NNO 100km querab stattfinden. Bei SOA hätte nur der Admin Arbeit.

Bis bald...
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.733 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Kommunikation zwischen zwei Delphiprogrammen

  Alt 29. Nov 2022, 13:38
Hallo,
>Programm 1 schreibt seine Daten, die berechnet werden sollen, in Verzeichnis A, Programm 2 wartet darauf, dass in Verzeichnis A Dateien angelegt werden,
Es ist das warten von Programm 2, also die Überwachung eines Verzeichnisses. Ich habe einen ziemlichen Teil des Sonntags damit verbracht dafür eine praktikable Lösung zu suchen.
...
Wie haben Sie das gelöst?
Gar nicht. Ich benutze diese Lösung nicht selbst, sie ist mir nur spontan eingefallen.

Es gibt dafür aber die WinAPI Funktionen FindFirstChangeNotification / FindNextChangeNotification, die ich z.B. in dzEditorLineendsFix verwende, um die Font-Datei, die Delphi 2007 erzeugt, jedesmal wieder in ein anderes Verzeichnis zu verschieben.

Der Code läuft in einem Hintergrundthread und sieht so aus:

Delphi-Quellcode:
procedure Tf_EditorLineEndsFix.ExecuteInThread(_Sender: TObject);
var
  Err: DWORD;
  NotifyHandle: THandle;
  Res: DWORD;
begin
  try
    CheckForFile;
    NotifyHandle := FindFirstChangeNotification(PChar(TFileSystem.GetTempPath), false,
      FILE_NOTIFY_CHANGE_FILE_NAME);
    if NotifyHandle = INVALID_HANDLE_VALUE then begin
      Err := GetLastError;
      RaiseLastOsErrorEx(Err, _('Error %1:s (%0:d)'));
    end;
    try
      while not TThread.CheckTerminated do begin
        Res := WaitForSingleObject(NotifyHandle, 100);
        if res = WAIT_OBJECT_0 then begin
          CheckForFile;
          if not FindNextChangeNotification(NotifyHandle) then begin
            Err := GetLastError;
            RaiseLastOsErrorEx(Err, _('Error %1:s (%0:d)'));
          end;
        end else if res = WAIT_TIMEOUT then begin
          // stay in the loop
        end else
          raise Exception.CreateFmt(_('WaitForSingleObject failed with error code %d.'), [res]);
      end;
    finally
      FindCloseChangeNotification(NotifyHandle);
    end;
  except
    on e: Exception do begin
      doWriteToLog(e.Message);
    end;
  end;
end;
Im Prinzip könntest Du diesen Code nutzen, müsstest nur in CheckForFile die Verarbeitung vornehmen. Und natürlich in FindFirstNotification statt TFileSystem.GetTempPath das korrekte Verzeichnis übergeben.

Und nicht vergessen: Der Code sollte in einem Hintergrund-Thread laufen, sonst blockiert er das UI.
Thomas Mueller
  Mit Zitat antworten Zitat
rwalper

Registriert seit: 6. Sep 2006
48 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Kommunikation zwischen zwei Delphiprogrammen

  Alt 30. Nov 2022, 15:58
Ein kleiner Hinweis noch zum Mechanismus mit den Dateien, denn damit hatte ich vor längerem zu tun.

Ich habe (kleine) Auftrags-Dateien erzeugt, der Server hat die gelesen, diese Dateien gelöscht und Antwort-Dateien erzeugt, die dann wiederun der Client gelesen und gelöscht hat.
Im lokalen Dateisystem funktioniert so etwas sehr gut und auch stabil.

Auf Netzlaufwerken sollte man allerdings vorsichtig sein. Seit der Einführung des SMB2-Protokoll gab es massive Probleme (das Zurückschalten auf SMB1 ist aus Sicherheitsgründen nicht zu empfehlen).
Bei sehr vielen Dateioperationen auf den Windows-Freigaben kann es sehr lange dauern, bis die Änderungen für den Client sichtbar sind, egal ob im Windows-Explorer oder den FindChangeNotifications, teilweise waren das 10 Sekunden!
Im Endeffekt haben wir den Dateimechanismus durch http ersetzt und seit dem keine Probleme.
  Mit Zitat antworten Zitat
Benutzerbild von rwb
rwb

Registriert seit: 28. Nov 2007
Ort: Tarmstedt
42 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Kommunikation zwischen zwei Delphiprogrammen

  Alt 30. Nov 2022, 21:46
Danke, ich bastele jetzt mit den verschiedenen Ansätzen rum, und wenn was dabei rauskommt melde ich mich.
Danke noch mal an Alle für Ihre Beiträge.
RWB
Das Leben ist Freude
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#9

AW: Kommunikation zwischen zwei Delphiprogrammen

  Alt 1. Dez 2022, 17:13
Es gibt dafür aber die WinAPI Funktionen FindFirstChangeNotification / FindNextChangeNotification, die ich z.B. in dzEditorLineendsFix verwende, um die Font-Datei, die Delphi 2007 erzeugt, jedesmal wieder in ein anderes Verzeichnis zu verschieben.

Der Code läuft in einem Hintergrundthread und sieht so aus:
...
Und nicht vergessen: Der Code sollte in einem Hintergrund-Thread laufen, sonst blockiert er das UI.
Diese API habe ich einer Netzwerkumgebung zum Überwachen eines EDI (Incoming) Verzeichnis auch einmal eingesetzt.
Solange die Anwendung kontinuierlich läuft, und das Netzwerkverzeichnis erreichbar ist, funktioniert es auch prima. Doch nach einer Netzwerkstörung, wegen der das Programm den Incoming-Ordner vorübergehend nicht sieht, oder einem Neustart des Programms, liegen eventuell Dateien im Incoming-Ordner, die zwischenzeitlich eingetroffen sind.
Daher muss man beim Start des Programms dann zusätzlich noch einmal einen normalen Directory-Scan durchführen. So gesehen hat man dann zwei Schleifen für ein und dieselbe Aufgabe.

Zur Kommunikation zwischen zwei Prozessen würde ich entweder das klassische Suchen im Dateisystem (Findxxx) verwenden, oder eine andere Methode für IPC. Client-Server basierte Lösungen jedoch nur mit einem zentralen Server. Nicht auf jedem Rechner im lokalen Netz möchte die IT "wilde" HTTP- oder sonstige offene Server-Ports sehen
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz