Autor Beitrag
UweK
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51
Erhaltene Danke: 1

Win 7
Delphi Enterprise XE6
BeitragVerfasst: Di 26.04.22 15:59 
Hallo allerseits,

Ich suche eine Möglichkeit, auf ein Ereignis zu reagieren, das außerhalb meines Programms auf dem PC passiert.

Die Situation: Ein LabView-Programm steuert Hardware, misst mit dieser etwas und schreibt das Ergebnis als Datenfile in ein Verzeichnis auf die Festplatte. Ich möchte in meinem Delphi-Hauptprogramm irgendwie eine Nachricht erhalten, dass ein neuer Datenfile erzeugt wurde, um mit diesem dann sofort automatisch weiterarbeiten zu können. Ideal wäre, dessen Namen gleich mit geliefert zu erhalten. Aber auch die reine Benachrichtigung würde schon reichen, da ich in meinem Hauptprogramm eine Liste der vorhandenen Datenfiles halten könnte. Deren Vergleich mit dem aktuellen Inhalt des Verzeichnisses würde dann den neuen Datenfile identifizieren.

Grundsätzlich könnte ich das Problem auch dadurch lösen, dass mein Hauptprogramm alle paar Sekunden von sich aus nach einem eventuellen neuen Datenfile im Verzeichnis schaut. Das finde ich aber zum einen nicht "elegant". Zum anderen würde ich auch gern das Prinzip einer solchen Botschaftsübermittlung zwischen verschiedenen Programmen verstehen, um diese Technik auch für andere Ereignisse zu nutzen, bei denen nicht unbedingt ein Datenfile geschrieben wird.

Der zuständige LabView-Programmierer kennt sich leider mit so etwas gar nicht aus und hat auch keine Zeit dafür. Er könnte auf einfache Weise aber zumindest nach jedem Schreiben eines seiner LabView-Datenfiles irgendein Hilfsprogramm (*.exe) starten, das auf dem PC liegt. Meine Idee ist nun: Ich schreibe ein winziges Delphi-Hilfsprogramm, das noch nicht einmal ein Programmfenster besitzt. Dieses hat nur die Aufgabe, eine Windows-Botschaft abzusetzen, und dann beendet es sich sofort wieder selbst. Mein Delphi-Hauptprogramm reagiert dann auf diese Botschaft. Der Vorteil dieser Konstruktion wäre, dass alles auf Delphi-Ebene passiert, so dass ich unabhängig von dem LabView-Programmmierer werde.

Könnte mir jemand Tipps geben, wie ich das anstellen kann? Oder kennt vielleicht jemand sogar irgendwo ein Beispielprogramm?

Vielen Dank für eure Hilfe.
Gruß Uwe
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 26.04.22 17:50 
> Zum anderen würde ich auch gern das Prinzip einer solchen Botschaftsübermittlung zwischen verschiedenen Programmen verstehen

Üblicherweise kennen sich die beteiligten Programme dann sonst braucht man ja eine Art Broadcast bzw. einen Broker. Kennt die Labview Seite den dein Programm?

Ansonsten wenn du das File eh brauchst um damit was zu tun ist das Verzeichnis zu überwachen in meinen Augen nicht unelegant (die Beteiligten müßen sich dann nicht kennen, sie brauchen keinen Broker dazwischen bzw. das Filesystem ist der Broker)
Man könnte die ReadDirectoryChanges(Ex) API benutzen um über Änderungen in dem Verzeichnis informiert zu werden. Die Api hat aber seine eigene Komplexität und Fallsticke. Polling auf das Verzeichnis ist da meist einfacher.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 26.04.22 23:24 
Es gibt wirklich sehr viele Möglichkeiten dafür. Eine recht einfache ist mit RegisterWindowMessage und BroadcastSystemMessage zu arbeiten.

Sprich man registriert eine systemweit eindeutige Windows Message ID über einen festgelegten Namen und schickt diese dann zur Benachrichtigung z.B. an alle laufenden Anwendungen. Der Witz an der Sache ist, dass die Hostanwendung (LabView) diese Nachricht registrieren kann und du aus einer anderen Anwendung heraus dann die gleiche ID bekommst, wenn der gleiche Name verwendet wird, so dass du darauf lauschen kannst.