-         

Ergebnis 1 bis 6 von 6

Thema: C#: Programmstart nur 1x "gleichzeitig" zulassen

  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987

    C#: Programmstart nur 1x "gleichzeitig" zulassen

    Anzeige

    Moin.

    Welche Möglichkeiten gibts denn in C# (Visual Studio 200, 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:
    Code:
      // firstInstance: global bool variable
      System.Threading.Mutex mutex = new System.Threading.Mutex(false, @"Local\MyAppName", out firstInstance);
      if (!firstInstance)
      {
        System.Diagnostics.Process.GetCurrentProcess().Kill();
      }
    Sobald aber eine der .exe umbenannt wird, wars das und das Programm startet 2x.

    Hat da jemand noch nen Trick?

    mfG
    #ifndef MfG
    #define MfG

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    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

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    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"
    #ifndef MfG
    #define MfG

  4. #4
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    47
    Beiträge
    497
    Warum vergibst du nicht anstelle von @"Local\MyAppName" einen festen Namen? Dann ist es doch egal wie jemand die Exe nennt.

    sast

    雅思特史特芬
    开发及研究

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    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.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    13.03.2007
    Beiträge
    86
    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...

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •