LabVIEWForum.de - mehrere Programminstanzen bei unterschiedlichen Benutzern verhindern

LabVIEWForum.de

Normale Version: mehrere Programminstanzen bei unterschiedlichen Benutzern verhindern
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo an Alle,

ich habe ein Problem mit multiplen Programminstanzen und ich hoffe ihr könnt mir da weiter helfen.

Grundsätzlich kümmert sich eine erstellte Exe ja selbst darum zu prüfen, ob sie schon mal geöffnet wurde und lässt das zweite Öffnen dann nicht zu (es sei denn man erlaubt es explizit).

Auf dem PC (Win7), wo meine Anwendung laufen soll, gibt es mehrere Benutzer. Nun habe ich festgestellt, dass ich eine Exe doppelt starten kann, wenn ich über "switch user" zwischendurch den Benutzer wechlse. Im Taskmanager ist der Prozess dann auch zweimal zu sehen. Ich möchte das aber gern verhindern - Kennt da jemand eine Möglichkeit?

Mir würde nur einfallen, selbst zu schauen, ob der Prozess bereits gestartet ist. Gibt es da eine LabView eigene Möglichkeit? Ich weiß, dass man die Informationen über "Systembefehl ausführen - cmd/tasklist" oder die WinAPI rausbekommen kann, wenn es aber auch einfacher geht, käme mir das natürlich entgegen.

Vielen Dank schonmal im Voraus für eure Ideen!
Hallo Goldie,

es gibt auch andere Wege, die Präsenz einer EXE anzuzeigen:
- Die EXE erstellt eine Datei ("Lock-File") sobald sie startet. Wenn eine andere Instanz der EXE startet und die Datei existiert schon, beendet sie sich gleich wieder…
- Die EXE öffnet einen Netzwerk-Port (TCP/UDP) und wartet dort auf Botschaften. Wenn eine andere Instanz startet und der Port ist schon belegt, beendet sie sich gleich wieder…
Hallo GerdW,

erstmal danke für deine schnelle Anwort.

Wenn ich das richtig verstehe, soll die Exe die Datei beim Start selbst erzeugen und beim Beenden wieder löschen?! Da fallen mir spontan zwei Probleme ein.

-Meine Kollegen benutzen zum Beenden gerne die Tastenkombination Alt+F4, die aber die Exe nicht geregelt beendet -> das könnte man villeicht noch über ein Event abfangen?
-Was mache ich, wenn der PC z.B. durch einen Stromausfall "hart" ausgeschalten wird? Dann ist die Datei da und das Programm denkt immer, es sei schon geöffnet.

Über den Vorschlag mit dem Netzwerk-Port werde ich mal nachdenken.
Hallo Goldie,

Zitat:Meine Kollegen benutzen zum Beenden gerne die Tastenkombination Alt+F4, die aber die Exe nicht geregelt beendet -> das könnte man villeicht noch über ein Event abfangen?
Ja, kannst du. Mit der Event-Struktur. Und "Panel Close?"-Event…

Zitat:Was mache ich, wenn der PC z.B. durch einen Stromausfall "hart" ausgeschalten wird? Dann ist die Datei da und das Programm denkt immer, es sei schon geöffnet.
Bei einem Stromausfall hast du andere Probleme Smile
Dann musst du eine evtl. noch vorhandene Datei manuell löschen…

Du siehst, alles hat seine Vor- und Nachteile. Vielleicht ist der Weg über den TaskManager (cmd/tasklist) doch einfacher?
Oder man verbietet verschiedene User-Accounts und lässt alles über einen Mess-Account laufen? Dein Programm kann auch den aktuell angemeldeten User abfragen und hier Restriktionen auflegen…
Hallo GerdW,

das mit dem "Panel Close?"-Event werd ich mir mal merken und mit reinbauen.

Was die Instanzen angeht, werde ich das wohl wirklich über den TaskManager machen. Der PC mit besagtem Programm gehört zu einer Maschine, die an einen Kunden verkauft ist. Wir brauchen also die eingestellten Benutzer, um mögliche Eingriffe in unser System zu verhindern. Daher kann ich auch nicht verlangen irgendwelche Dateien von Hand zu löschen oder ähnliches.

Trotzdem Danke für deine Unterstützung und einen schönen Nachmittag.
Also IMHO dürfte das hier am einfachsten zu realisieren sein (gerade mit UDP).
(10.09.2014 13:04 )GerdW schrieb: [ -> ]- Die EXE öffnet einen Netzwerk-Port (TCP/UDP) und wartet dort auf Botschaften. Wenn eine andere Instanz startet und der Port ist schon belegt, beendet sie sich gleich wieder…
Gruß, Jens
(15.09.2014 17:53 )jg schrieb: [ -> ]Also IMHO dürfte das hier am einfachsten zu realisieren sein (gerade mit UDP).
(10.09.2014 13:04 )GerdW schrieb: [ -> ]- Die EXE öffnet einen Netzwerk-Port (TCP/UDP) und wartet dort auf Botschaften. Wenn eine andere Instanz startet und der Port ist schon belegt, beendet sie sich gleich wieder…
Gruß, Jens

Einfach, aber nicht ganz idiotensicher. Könnte eine beliebige Applikation sein die diesen Port schon offen hat, entweder durch ihn geziehlt anzufragen oder aber durch das Betriebssystem dynamisch ausgegben. Wäre schon lästig wenn der Kunde die eigene Applikation nicht starten kann, wenn eine bestimmte andere Applikation schon aktiv ist (wenn diese den Port explizit anfragt) oder sporadisch wenn Windows diesen Port schon ausgegeben hat.

Unter Windows und neueren LabVIEW Versionen könnte man dem eventuel mit etwas extra Mühe abhelfen indem man einen Servicenamen spezifiziert anstelle einer Portnummer. Der wird dann beim NI Service Manager registriert.

Beim aufstarten versucht man erst mit dem Servicenamen eine Verbindung als Client. Wenn das gelingt kann man zur Sicherheit noch ein bestimmtes Command-Response Protokoll probieren. Wenn die Verbindung nicht gelingt kann man versuchen einen Server mit dem Servicenamen zu öffnen und ihn geöffnet halten.
Hallo,
Zitat:Auf dem PC (Win7), wo meine Anwendung laufen soll
versuch mal das Beispiel im Anhang.

Gruß
Ralf
Referenz-URLs