Seite 1 von 1

Frage zu "Nur eine Instanz erlauben"

Verfasst: 20.06.2019 14:46
von bin_neu_hier
Tach allerseits!

Habe eine Verständnisfrage zum Beitrag viewtopic.php?f=16&p=260173#p260173

Hier hat PureLust einen Beitrag von mk-soft folgendermaßen zusammengefasst:

Code: Alles auswählen

Global g_hMutexAppRunning

Procedure AppInstanceExists()
   Protected bAppRunning = FALSE;
  g_hMutexAppRunning = CreateMutex_( #Null, #Null, "Global\MyApplication1");
  If (g_hMutexAppRunning <> #Null) And (GetLastError_() = #ERROR_ALREADY_EXISTS)
    CloseHandle_( g_hMutexAppRunning );
    g_hMutexAppRunning = #Null;
  EndIf
  If g_hMutexAppRunning
    ProcedureReturn #False;
  Else
    ProcedureReturn #True
  EndIf
EndProcedure

If AppInstanceExists()
  MessageRequester("Info", "Programm läuft bereit - zweite Instanz wird beendet.")
  End
Else
  MessageRequester("Info", "Programm läuft noch nicht - dies ist die erste Instanz.")
EndIf

; !!! NICHT VERGESSEN !!! - Global Mutex wieder freigeben
CloseHandle_(g_hMutexAppRunning)
Hier wird am Ende "CloseHandle_(g_hMutexAppRunning)" aufgerufen, weil das nicht vergessen werden dürfe, ist aber in der "IF-Abfrage" der Procedure auch schon drin. Muss das Handle 2x geschlossen werden?

edit:
Und: Wird das "Global g_hMutexAppRunning" überhaupt in dieser Zusammenfassung benötigt?

Re: Frage zu "Nur eine Instanz erlauben"

Verfasst: 20.06.2019 14:58
von RSBasic
bin_neu_hier hat geschrieben:Hier wird am Ende "CloseHandle_(g_hMutexAppRunning)" aufgerufen, weil das nicht vergessen werden dürfe, ist aber in der "IF-Abfrage" der Procedure auch schon drin. Muss das Handle 2x geschlossen werden?
Es wird in beiden Szenarien die Handle-Nummer jeweils einmal freigegeben.

Fall 1:
Programm wird gestartet und es wird festgestellt, dass das Programm noch nicht läuft.
Zeile 7 zum Freigeben der Handle-Nummer wird nicht ausgeführt, weil GetLastError_() = 0 ist.
So lange die Anwendung läuft, wird nichts freigegeben. Wenn die Anwendung beendet wird, wird zum Schluss die Handle-Nummer freigegeben. Siehe Zeile 25.

Fall 2:
Programm wird gestartet und es wird festgestellt, dass das Programm bereits läuft.
Zeile 7 zum Freigeben der Handle-Nummer wird ausgeführt, weil GetLastError_() = #ERROR_ALREADY_EXISTS ist.
Da danach #True zurückgegeben wird, wird in Zeile 19 das Schlüsselwort End zum sofortigen Beenden ausgeführt und kommt nicht weiter zur Zeile 25.
bin_neu_hier hat geschrieben:Und: Wird das "Global g_hMutexAppRunning" überhaupt in dieser Zusammenfassung benötigt?
Diese Variable brauchst du zum Schluss noch, wenn dein Programm beendet wird, um die Handle-Nummer freizugeben. Ist also nur für den Fall 1 notwendig.

Re: Frage zu "Nur eine Instanz erlauben"

Verfasst: 20.06.2019 15:07
von NicTheQuick
@RSBasic:
Das wichtige ist die Überprüfung des Fehlers: GetLastError_() = #ERROR_ALREADY_EXISTS

Du sagst gerade, das zwei verschiedene Dinge passieren, obwohl der Grund der gleiche ist. :wink:
RSBasic hat geschrieben:Zeile 7 zum Freigeben der Handle-Nummer wird nicht ausgeführt, weil g_hMutexAppRunning nicht Null ist.
<snip>
Zeile 7 zum Freigeben der Handle-Nummer wird ausgeführt, weil g_hMutexAppRunning ungleich Null ist.

Re: Frage zu "Nur eine Instanz erlauben"

Verfasst: 20.06.2019 15:32
von RSBasic
NicTheQuick hat geschrieben:Du sagst gerade, das zwei verschiedene Dinge passieren, obwohl der Grund der gleiche ist. :wink:
Ups, danke für den Hinweis. Ich habe meine Erklärung angepasst.

Re: Frage zu "Nur eine Instanz erlauben"

Verfasst: 20.06.2019 22:39
von bin_neu_hier
... und schon wieder etwas mehr Licht im Dunkel.

Besten Dank!