Entwickler-Ecke

Sonstiges (Delphi) - Reaktion auf ein Ereignis außerhalb des Programms


UweK - Di 26.04.22 15:59
Titel: Reaktion auf ein Ereignis außerhalb des Programms
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 - 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 - Di 26.04.22 23:24

Es gibt wirklich sehr viele Möglichkeiten dafür. Eine recht einfache ist mit RegisterWindowMessage [https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-registerwindowmessage] und BroadcastSystemMessage [https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-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.