Programm nicht zweimal gleichzeitig ausführen.
-
Hallo,
ich hoffe mir kann jemand helfen. Mein Problem ist eigentlich schon komplett im Betreff beschrieben. Wie kann ich vermeiden, dass mein Programm zweimal nebeneinander existiert, also erneut gestartet wird, während die Applikation schon läuft?
Danke für eure Hilfe,
mvp
-
Welches Betriebssystem?
-
WinXP
-
Ok, dann wird dein Beitrag gleich nach WinAPI verschoben.
Hier schonma was zu lesen: http://www.flounder.com/nomultiples.htm
Stichwort: CreateMutex
-
ansonsten erstell mit dem prog beim start eine .pid in der du eine prozess id reinschreibst.
wenn prog gestartet wird wird geprüft obs die schon gibt, wenn ja, programm wieder beenden.is halt blöd wenn system abschmiert...
is übrigens ne technik die ich in linux öfter sehe (naja.. zumindest bei server diensten ^^
-
in windows ist das mit dem mutex schon der elgeantere weg... hier nochmal ein link in deutsch dazu
http://www.fun-soft.de/showtopic.php?threadid=1325&time=1081326128
-
IIRC liegt auf das verhindern von mehrfachen Programminstanzen in Europa ein Patent. Also bereit dich schonmal drauf vor das wieder rauszunehmen

-
server schrieb:
ansonsten erstell mit dem prog beim start eine .pid in der du eine prozess id reinschreibst.
wenn prog gestartet wird wird geprüft obs die schon gibt, wenn ja, programm wieder beenden.
is halt blöd wenn system abschmiert......und blöd wenn das programm abstürzt, jemand die datei umbenennt, verschiebt, read-only macht usw...
server schrieb:
is übrigens ne technik die ich in linux öfter sehe...
ja, welch schäbiges bastelsystem dieses linux doch ist, wenn man immer zu solchen hacks und workarounds greifen muss

-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Übrigens hier die richtige Version für Win32 mittels WinApi
HANDLE Mutex = OpenMutex(MUTEX_ALL_ACCESS,false,ApplicationName); // ApplicationName is ein Nullterminierter String - sollte Möglichs eindeutig sein(Paar Konstante Zahlen dranhängen oder so Muss bei jedem Start gleich sein) if (Mutex == NULL) // Wenn der MUTEX noch nicht existiert { Mutex = CreateMutex(NULL,true,ApplicationName); // wird er angelegt } else { HWND Handle0 = FindWindow(MainFormName,NULL); // MainFormName is der ClassName deines Fensters, anhand dessen es identifiziert wird if (Handle0) // Wenn Fenster gefunden { ShowWindow(Handle0,SW_SHOWNORMAL); // Zeig das Fenster an SetForegroundWindow(Handle0); // und Setz es an den Vordergrund } return 0; // und beende das Programm }Das am Anfang des Programms einfügen.
@net: Das war aber schon nich ganz ohne Ironie, gell?

-
Statt direkt ne PID file zu nehmen reicht es wohl eine datei via flock() zu locken. der lock gehoert zum prozess und verschwindet automatisch wenn dieser terminiert.
-
Man sollte aber statt Mutexes besser Semaphores nehmen, da Mutexes unter Windows 98 bei einem Programmabsturz eventuell nicht mehr richtig freigegeben werden und dann läßt sich das Programm nicht mehr starten.