Alternative zu einem Mutex?



  • Ich will ein Programm nur einmal starten lassen, also nur eine Instanz erlauben. Ich hab es bisher mit einem Mutex versucht und bin da allerdings auf Probleme gestoßen. Gibt es irgendeine Alternative dazu?



  • Du kannst auch andere benannte Kernel-Objecte nehmen, z.B Semaphoren. Aber was soll es mit Mutexen für Probleme geben? Kann es nicht auch sein, daß Du was falsch gemacht hast?



  • mein programm macht in etwa folgendes:

    1. initialisierung
    2. eventuell anderen prozess starten
    3. testen ob es den mutex schon gibt
    4. code in einen wiederum anderen prozess kopieren und starten

    im wiederum anderen prozess:

    1. mutex erstellen

    bei 2) kann es nun vorkommen, dass der prozess der gestartet werden soll, der eigene ist. dadurch wird irgendwie der check mit dem mutex umgangen.
    ist es eigentlich normal, dass unter win98 createmutex beim vorhandensein eines gleichnamigen mutexes 0 zurückgibt, winxp aber nicht?



  • bei 2) kann es nun vorkommen, dass der prozess der gestartet werden soll, der eigene ist. dadurch wird irgendwie der check mit dem mutex umgangen.

    Das ist, wenn ich Dich richtig verstehe, auch richtig so. Du mußt CreateMutex bereits bei 0) aufrufen (so früh wie möglich!) und Dir den Error-Code (von GetLastError) merken. Dann kann Du den Test bei 3) mit dem Mutex und dem Error von 0) durchführen.

    ist es eigentlich normal, dass unter win98 createmutex beim vorhandensein eines gleichnamigen mutexes 0 zurückgibt

    Das ist nicht normal. Von solchen Einschränkungen steht auch nichts in der Doku. Aber wie heißt es so schön: "To get extended error information, call GetLastError."



  • Ok, vielen Dank. Allerdings besteht noch ein kleines Problem: Wenn ich schon bei 0) den Mutex erstelle, müsste ich den im anderen Prozess wiederum irgendwie übernehmen. Denn mein eigener Prozess dient nur dazu Code in einen anderen zu kopieren und dort zu starten. Dort ist quasi mein Hauptthread. Naja, ich werde mal ein wenig rumprobieren.



  • Ok, vielen Dank. Allerdings besteht noch ein kleines Problem: Wenn ich schon bei 0) den Mutex erstelle, müsste ich den im anderen Prozess wiederum irgendwie übernehmen.

    Warum? Der andere Process ruft doch ebenfalls CreateMutex auf, dann hat er doch ebenfalls das Mutex. Vom anderen Process übernehmen mußt Du da nichts.



  • Wie ich schon sagte: Unter Win98 funktionierte das bei mir nicht. CreateMutex lieferte immer 0 zurück, wenn es den Mutex bereits gibt. 😞



  • Was sagt denn GetLastError? 🙄



  • wahrscheinlich ERROR_ALREADY_EXISTS



  • Wie ich schon sagte: Unter Win98 funktionierte das bei mir nicht.

    Gibt es vielleicht ein Beispiel, mit dem es möglich ist, das Problem zu reproduzieren?



  • Hmm ... ich glaube ich muss da wohl doch einen Fehler gemacht haben. Ich hab das ganze nochmal neu geschrieben und jetzt scheint es wunderbar zu funktionieren. Trotzdem Danke.


Anmelden zum Antworten