PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C#: Programmstart nur 1x "gleichzeitig" zulassen



Jaecko
25.03.2010, 10:23
Moin.

Welche Möglichkeiten gibts denn in C# (Visual Studio 2008), den mehrfachen Programmstart zu unterbinden, AUCH wenn die .exe-Dateien unterschiedlich heissen?
(Weil z.B. die auszuwertende Hardware nur mit 1 Instanz kommunizieren kann und ein weiterer Programmstart Chaos verursacht.)

Das erste Problem hab ich mit einem Mutex gelöst. Funktioniert auch, wenn die jeweilige .exe mit gleichem Namen an anderen Orten liegt bzw. wenn die gleiche .exe mehrfach gestartet wird.

Code direkt im Load-Event des Main-Forms:


// firstInstance: global bool variable
System.Threading.Mutex mutex = new System.Threading.Mutex(false, @"Local\MyAppName", out firstInstance);
if (!firstInstance)
{
System.Diagnostics.Process.GetCurrentProcess().Kil l();
}


Sobald aber eine der .exe umbenannt wird, wars das und das Programm startet 2x.

Hat da jemand noch nen Trick?

mfG

radbruch
25.03.2010, 11:02
Hallo

Das Programm erzeugt beim Start eine temporäre Datei deren Existenz bei jedem Programmstart überprüft wird. Ist die Datei schon vorhanden wurde das Programm schon gestartet. Beim Programmende wird die Datei wieder gelöscht. Nach einem Absturz muss man die Datei "von Hand" löschen (oder man verwendet beim Start einen Parameter der die Dateiprüfung außer Kraft setzt).

Gruß

mic

Jaecko
25.03.2010, 11:08
Die Idee mit der Datei ist eigentlich auch nicht schlecht.
Nur kommt da eben das Problem: Wie bringt man einem (X)DAU bei, bei nem Programmabsturz ne bestimmte Datei zu löschen?

Was mir noch eingefallen wäre: Das programm prüft sich selbst, ob die .exe noch so heisst, wie sie soll. Wenn da manipuliert wurde: "Ne, ich mag ned"

sast
25.03.2010, 14:17
Warum vergibst du nicht anstelle von @"Local\MyAppName" einen festen Namen? Dann ist es doch egal wie jemand die Exe nennt.

sast

uwegw
25.03.2010, 19:50
Ich würde eher sagen, die Hardwareschnittstelle ist Mist. Eigentlich ist es doch üblich, dass man vorm Zugriff auf eine Schnittstelle abfragen kann, ob sie schon offen ist, bzw. dass man beim versuchten Öffnen einen Fehlercode zurückbekommt. Ist nur blöd, weil du da wahrscheinlich nichts ändern kannst, oder?

Wenn du den Workaround mit der temporären Datei nehmen musst:
Du könntest vom Programm regelmäßig (z.B. alle 30 Sekunden, das sollte wohl reichen) die aktuelle Systemzeit in die Datei schreiben lassen. Wenn nun die zweite Instanz die Datei prüft, vergleicht sie die Zeit. Sind es weniger als 30 Sekunden Differenz, läuft schon eine andere Instanz. Wenn aber mehr Zeit vergangen ist, dürfte die erste Instanz abgeschmiert sein. Zusätzlich könnte man evtl. im Autostart die Datei löschen.

.:markus:.
25.03.2010, 21:51
Würde auch den Ansatz von uwegw vorschlagen aber in eine Datei zu schreiben gefällt mir nicht, besser wäre die Ticks der aktuellen Systemzeit abzufragen.

Andere Variante wäre noch die Namen der Prozesse abzufragen und zu vergleichen ob der eigene Prozess bereits gestartet wurde. Weiß aber leider nicht ob man den Prozessnamen auch umbenennen kann...