Meine Anwendung...
-
Hi,
ich möchte das meine Anwendung nur 1 X gestartet werden kann, habe dies nun erreicht indem ich die Prozessliste auslese und bevor meiner Anwendung ein Application::Run zu nahe kommt wird Sie halt entsprechend den laufenden Prozessen gestartet oder nicht...
Gibts dafür nicht eine sauberere Lösung?
-
Schau mal ob Dich das weiter bringt:
-
Also ohne viel zu suchen würd ich mal den Tipp geben zu prüfen ob ein Programm läuft per Datei im Programmverzeichnis. Wenn das Programm läuft soll der Wert von 0 auf 1 geht. Wenn das Programm aus ist wieder auf 0 zurück.
Hab sowas schonmal gelesen. Hab aber keinen Link zur Hand sry.
-
Unbrauchbar.
a) Ungünstige Umstände können die Anwendung immer noch doppelt starten. (1 prüft auf 0, 2 prüft auf 0, 1 startet und setzt die Datei auf 1, 2 startet und setzt die Datei auf 1)
b) Der Datenträger könnte schreibgeschützt sein
c) Die Anwendung wird mehrfach aus verschiedensten Orten gestartet.
-
Siehe:
http://www.codeproject.com/csharp/CSSIApp.aspbzw. dort die Kommentare ganz unten... =>
static void Main(string[] args) { Mutex ^mutex = nullptr; bool owned = false; try { mutex = gcnew Mutex( true, "this is my unique string", owned); if(owned) { Application::EnableVisualStyles(); Application::Run(gcnew MainFrame(args)); } } finally { if(mutex != nullptr && owned) { mutex->ReleaseMutex(); } } }
-
Super, dankeschön.
Funktionert einwandfrei, musste nur nochusing namespace System::Threading;
und aus null->nullptr ergänzen.
Habe bisher noch keine Mutexe kennengelernt, also berichtigt mich wenn ich mit meinem Verständnis falsch liege, ich muss mal ein paar dumme Fragen stellen:
Ein Mutex wird nach den Quellen wo ich nachgesehen habe als "Verfahren" beschrieben um gleichzeitigen Zugriff auf eine Ressource zu verhindern, ist das richtig? Ist ein Mutex nicht eine "einfache Variable" mit Besitzanzeige die im Speicher abgelegt wird?
Im obigen Beispiel wird der Mutex entweder erstellt, wodurch der anfängliche Besitz und owned true wird und die Application gestartet wird.
Andernfalls wird der Mutex nicht mit anfänglichem Besitz übernommen durch den Thread der gerade diese Abfrage durchläuft, owned bleibt false da er ja durch diesen Aufruf nicht den anfänglichen Besitz für das Mutex bekam.
Ich muss nach meinen Nachforschungen ZWINGEND den Mutex wieder freigeben da ich ansonsten einen Mutex im Speicher lasse der durch das obige Codebeispiel gar nicht mehr "geowned" werden kann, richtig?
Und dort gibt er ihn auch nur frei wenn das Objekt erstellt ist und er durch owned ja den anfänglichen Besitz bekommen hat.
Was passiert mit dem Mutex nach seiner Freigabe? Wird er automatisch aus dem Speicher entfernt?
-
Destructor1978 schrieb:
Super, dankeschön.
Funktionert einwandfrei, musste nur nochusing namespace System::Threading;
und aus null->nullptr ergänzen.
Habe bisher noch keine Mutexe kennengelernt, also berichtigt mich wenn ich mit meinem Verständnis falsch liege, ich muss mal ein paar dumme Fragen stellen:
Ein Mutex wird nach den Quellen wo ich nachgesehen habe als "Verfahren" beschrieben um gleichzeitigen Zugriff auf eine Ressource zu verhindern, ist das richtig? Ist ein Mutex nicht eine "einfache Variable" mit Besitzanzeige die im Speicher abgelegt wird?
**Ja. Eine Art einen Mutex zu sehen ist eine Variable mit Besitzinformation. (z.b. kann eine Thread über den eigens gelockten Mutex nicht deadlocken. Was bei posix übrigens nicht das defaultverhalten ist) Ausserdem garantiert dir das Betriebssystem den atomischen Zugriff auf dieses Object. Daraus ergibts sich eben der "Umstand" es als Schutz für Resourcen zu verwenden;)
**Im obigen Beispiel wird der Mutex entweder erstellt, wodurch der anfängliche Besitz und owned true wird und die Application gestartet wird.
Andernfalls wird der Mutex nicht mit anfänglichem Besitz übernommen durch den Thread der gerade diese Abfrage durchläuft, owned bleibt false da er ja durch diesen Aufruf nicht den anfänglichen Besitz für das Mutex bekam.
Ich muss nach meinen Nachforschungen ZWINGEND den Mutex wieder freigeben da ich ansonsten einen Mutex im Speicher lasse der durch das obige Codebeispiel gar nicht mehr "geowned" werden kann, richtig?
**
Wenn du damit meinst den Mutex wieder freizugeben und zu löschen wenn dein Programm terminiert!? -- Dann ist die Antwort: nicht zwingend!
Das Betriebssystem kümmert sich um alle Objekte die an deinem Prozess dranhängen. Wenn dem nicht so wäre, wäre der Nutzen dieses Verfahrens höchst sinnlos.**
3)
Und dort gibt er ihn auch nur frei wenn das Objekt erstellt ist und er durch owned ja den anfänglichen Besitz bekommen hat.
Was passiert mit dem Mutex nach seiner Freigabe? Wird er automatisch aus dem Speicher entfernt?
-
OK,riesendank, ich mache große Schritte vorwärts... Da sich das Betriebssystem um das Mutex Objekt kümmert, wieso macht er noch einen ReleaseMutex am Ende?
-
Destructor1978 schrieb:
OK,riesendank, ich mache große Schritte vorwärts... Da sich das Betriebssystem um das Mutex Objekt kümmert, wieso macht er noch einen ReleaseMutex am Ende?
Das gehört für C++ Programmierer zum guten Stil - selbst angeforderte Ressourcen werden auch selbst wieder freigegeben (klar könnte man sich auch auf das System verlassen, aber wer will das schon?)