02.02.2017, 16:30
Beitrag #1
|
TpunktN
LVF-Gelegenheitsschreiber
Beiträge: 216
Registriert seit: Jul 2011
2021
2011
EN
70***
Deutschland
|
Laufende exe soll den Start einer anderen exe verhindern.
Servus LV'er und LV'erinnen,
an einer Anlage gibt es zwei Programme, eine Automatik und einen manuellen Betrieb. Beides .exe Programme die auf ein Delphin Messsystem zugreifen. Wenn jetzt beide Programme laufen, blockieren sie sich teils gegenseitig, z.Bsp.: Motorregelung oder Gerät lesen.
Im Forum habe ich jetzt schon einige Dinge gefunden: Shared Variable, diverse localhost, ..
Alles machbar, aber aufwendig und nicht unbedingt gegen Fehler abgesichert (Programmabsturz setzt den Wert nicht zurück)
Deswegen meine Suche nach einer einfachen Lösung, zB die Abfrage ob Programm xy läuft, oder gar eine integrierte Lösung in LabVIEW.
Meine Lösungsidee bis jetzt: Der Messkarte ein virtuellen Ausgang zu aktivieren, wenn eines der Programme startet und beim beenden zu deaktivieren. Beide Programme müssen beim Start diesen Ausgang lesen und sich evtl selbst beenden.
Was mir nicht gefällt, wenn das Programm nicht richtig beendet wird, bleibt der Wert und ich benötige eine Art Reset.
Hätte ich in der such und schreibzeit statdessen programmiert, währe ich wohl fertig. Dafür habe ich gelernt GVs funktionieren nicht zwischen .exe
Justieren ist dem Gerät sagen was es anzeigen soll, kalibrieren ist die Kontrolle dieser Anzeige. Eichen ist ein längerer Prüfprozess und darf nur das Eichamt!
|
|
|
02.02.2017, 16:58
(Dieser Beitrag wurde zuletzt bearbeitet: 02.02.2017 17:01 von GerdW.)
Beitrag #2
|
GerdW
______________
Beiträge: 17.465
Registriert seit: May 2009
LV2021
1995
DE_EN
10×××
Deutschland
|
RE: Laufende exe soll den Start einer anderen exe verhindern.
Hallo T.N,
Zitat:Deswegen meine Suche nach einer einfachen Lösung, zB die Abfrage ob Programm xy läuft
Einfach mal den Taskmanager befragen, welche Programme gerade laufen und prüfen, ob die jeweils andere EXE im Speicher ist…
(Zum Abfragen des Taskmanagers einfach mal googlen, du findest Beispiel garantiert im NI-Forum und wahrscheinlich auch hier.)
Zitat:Dafür habe ich gelernt GVs funktionieren nicht zwischen .exe
Eine globale Variable funktioniert nur im Kontext der ausführenden EXE!
Wenn man zwischen zwei Programmen Daten austauschen will, verwendet man Netzwerkkommunikation aka SharedVariables…
Zitat:Alles machbar, aber aufwendig und nicht unbedingt gegen Fehler abgesichert (Programmabsturz setzt den Wert nicht zurück)
Ich sehe da einen Zielkonflikt zwischen den Anforderungen "nicht aufwendig" und "gegen Fehler abgesichert"!
Und wenn ein Programm abstürzt, dann sollte im Hinblick auf weitere störungsfreie Kommunikation mit der Hardware vielleicht besser der PC neu gestartet werden!?
Alternative Idee: Deine EXE öffnen eine Datei auf dem PC exklusiv und schließen die Datei beim Beenden wieder. Der jeweils zweite erhält keinen Zugriff auf die Datei und muss sich sofort beenden. Zum Thema "Programmabsturz" siehe oben!
|
|
|
02.02.2017, 17:56
Beitrag #3
|
jg
CLA & CLED
Beiträge: 15.864
Registriert seit: Jun 2005
20xx / 8.x
1999
EN
Franken...
Deutschland
|
RE: Laufende exe soll den Start einer anderen exe verhindern.
(02.02.2017 16:30 )TpunktN schrieb: Meine Lösungsidee bis jetzt: Der Messkarte ein virtuellen Ausgang zu aktivieren, wenn eines der Programme startet und beim beenden zu deaktivieren. Beide Programme müssen beim Start diesen Ausgang lesen und sich evtl selbst beenden.
Was mir nicht gefällt, wenn das Programm nicht richtig beendet wird, bleibt der Wert und ich benötige eine Art Reset.
Auf der Messkarte, dann hast du wieder von 2 Programmen den Zugriff auf dieselbe HW, und gerade das macht dir doch die Probleme...
Dann vielleicht lieber eine Shared Variable. Und damit man sieht, dass was passiert, schreibst du dauernd (z.B. jede Sekunde) einen anderen Wert rein.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
Einführende Links zu LabVIEW, s. GerdWs Signatur.
|
|
|
02.02.2017, 19:25
Beitrag #4
|
IchSelbst
LVF-Guru
Beiträge: 3.689
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
RE: Laufende exe soll den Start einer anderen exe verhindern.
Du kannst auch einen Mutex machen.
Du brauchst dafür CreateMutex(), GetLastError() (183: Mutex existiert) und ReleaseMutex() (288: Release verboten), alles drei in Kernel32.dll. Leider hab ich gerade kein Muster- VI vorliegen ...
Dieses Verfahren geht natürlich nur, wenn du die Programme, die sich gegenseitig verriegeln sollen, selbst erstellst. Woher solltest du sonst den Mutex-Namen kennen?
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
03.02.2017, 20:42
Beitrag #5
|
|
|
07.02.2017, 17:06
Beitrag #6
|
TpunktN
LVF-Gelegenheitsschreiber
Beiträge: 216
Registriert seit: Jul 2011
2021
2011
EN
70***
Deutschland
|
RE: Laufende exe soll den Start einer anderen exe verhindern.
Danke für die vielen Antworten.
(02.02.2017 16:58 )GerdW schrieb: ...Einfach mal den Taskmanager befragen, welche Programme gerade laufen und prüfen, ob die jeweils andere EXE im Speicher ist…...
Die Programme sind offen, laufen aber nicht gleichzeitig, denke da unterscheidet der Taskmanager nicht. Unter Last schwanken sie zwischen 0 und 0,5% CPU Nutzung
Zitat:Alternative Idee: Deine EXE öffnen eine Datei auf dem PC exklusiv und schließen die Datei beim Beenden wieder. Der jeweils zweite erhält keinen Zugriff auf die Datei und muss sich sofort beenden. Zum Thema "Programmabsturz" siehe oben!
Das sieht mir nach einer einfachen Lösung aus und ich weis wie man Dateien öffnet
Shared Variables ist sicher besser, aber ich habe damit noch nicht gearbeitet, was wieder Zeit kostet die ich nicht habe.
IchSelbst schrieb:Du kannst auch einen Mutex machen.
Klingt einfach, werde ich mir mal anschauen, für alle Programme habe ich den Quellcode
Justieren ist dem Gerät sagen was es anzeigen soll, kalibrieren ist die Kontrolle dieser Anzeige. Eichen ist ein längerer Prüfprozess und darf nur das Eichamt!
|
|
|
12.02.2017, 19:43
Beitrag #7
|
rolfk
LVF-Guru
Beiträge: 2.305
Registriert seit: Jun 2007
alle seit 6.0
1992
EN
2901GG
Niederlande
|
RE: Laufende exe soll den Start einer anderen exe verhindern.
(02.02.2017 16:30 )TpunktN schrieb: Servus LV'er und LV'erinnen,
an einer Anlage gibt es zwei Programme, eine Automatik und einen manuellen Betrieb. Beides .exe Programme die auf ein Delphin Messsystem zugreifen. Wenn jetzt beide Programme laufen, blockieren sie sich teils gegenseitig, z.Bsp.: Motorregelung oder Gerät lesen.
Im Forum habe ich jetzt schon einige Dinge gefunden: Shared Variable, diverse localhost, ..
Alles machbar, aber aufwendig und nicht unbedingt gegen Fehler abgesichert (Programmabsturz setzt den Wert nicht zurück)
Deswegen meine Suche nach einer einfachen Lösung, zB die Abfrage ob Programm xy läuft, oder gar eine integrierte Lösung in LabVIEW.
Meine Lösungsidee bis jetzt: Der Messkarte ein virtuellen Ausgang zu aktivieren, wenn eines der Programme startet und beim beenden zu deaktivieren. Beide Programme müssen beim Start diesen Ausgang lesen und sich evtl selbst beenden.
Was mir nicht gefällt, wenn das Programm nicht richtig beendet wird, bleibt der Wert und ich benötige eine Art Reset.
Hätte ich in der such und schreibzeit statdessen programmiert, währe ich wohl fertig. Dafür habe ich gelernt GVs funktionieren nicht zwischen .exe
Grundsätzlich ist die Idee mit einem Lock File gar nicht mal so schlecht. Jede Applikation probiert das File zu öffnen und setzt danach gleich die Sharingerlaubnis mit "Deny Access" so dass keine andere Applikation das noch öffnen darf. Danach lässt man das File offen bis man mit der Resource nichts mehr tun will und schliesst es dann. Wenn der Prozess abstürzt schliesst Windows das File automatisch und geht es doch noch gut.
Das folgende ist ziemlich rauh und würde ich so sicher nicht implementieren. Das Handling des Lockfiles würde ich in eine Intelligente Globale Variable verlegen mit den Methoden "Aquire Lock" und "Release Lock" für den Versuch das File zu öffnen (Acquire Lock) die den Status zurückgibt ob das auch gelungen ist und in dem Fall wird die FileRefnum im internen Shiftregister abgespeichert. Die zweite Method (Release Lock) schliesst die FileRefnum einfach.
|
|
|
| |