![]() |
AW: Kommunikation zwischen zwei Delphiprogrammen
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 :-D Mit besten Grüßen RWB |
AW: Kommunikation zwischen zwei Delphiprogrammen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
WM_COPYDATA wird benutzt um was von Programm A zu Programm B zu senden. Funktioniert bei mir immer tadellos, habe eine kleine Demo dazu angehangen. Viel spaß beim testen. |
AW: Kommunikation zwischen zwei Delphiprogrammen
Zitat:
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? |
AW: Kommunikation zwischen zwei Delphiprogrammen
Zitat:
Bis bald... Thomas |
AW: Kommunikation zwischen zwei Delphiprogrammen
Liste der Anhänge anzeigen (Anzahl: 1)
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 ![]() ![]() aber damit komme ich nicht klar. |
AW: Kommunikation zwischen zwei Delphiprogrammen
Korrektur,
inzwischen konnte ich die jvcl von der jvcl-master.zip installieren. |
AW: Kommunikation zwischen zwei Delphiprogrammen
>Viel spaß beim testen.
Danke KodeZwerg, den Spaß hatte ich. Hat auf Anhieb funktioniert. Den Code sehe ich mir morgen an. |
AW: Kommunikation zwischen zwei Delphiprogrammen
Zitat:
|
AW: Kommunikation zwischen zwei Delphiprogrammen
Zitat:
Es gibt dafür aber die WinAPI Funktionen FindFirstChangeNotification / FindNextChangeNotification, die ich z.B. in ![]() Der Code läuft in einem Hintergrundthread und sieht so aus:
Delphi-Quellcode:
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.
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; Und nicht vergessen: Der Code sollte in einem Hintergrund-Thread laufen, sonst blockiert er das UI. |
AW: Kommunikation zwischen zwei Delphiprogrammen
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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