Frage zu "Nur eine Instanz erlauben"

Anfängerfragen zum Programmieren mit PureBasic.
bin_neu_hier
Beiträge: 105
Registriert: 06.03.2019 21:52

Frage zu "Nur eine Instanz erlauben"

Beitrag 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?
Bin mit 21 erstmals mit Computern in Kontakt gekommen und konnte mich daher in meiner Jugend ganz auf den Alkohol konzentrieren. Bin nun seit fast 40 Jahren programmiertechnisch konstant auf Anfänger-Level, konnte jedoch beim Thema Alkohol eine gewisse Virtuosität erreichen.
Irgendwas muss man ja gut können.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Frage zu "Nur eine Instanz erlauben"

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Frage zu "Nur eine Instanz erlauben"

Beitrag 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.
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Frage zu "Nur eine Instanz erlauben"

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
bin_neu_hier
Beiträge: 105
Registriert: 06.03.2019 21:52

Re: Frage zu "Nur eine Instanz erlauben"

Beitrag von bin_neu_hier »

... und schon wieder etwas mehr Licht im Dunkel.

Besten Dank!
Bin mit 21 erstmals mit Computern in Kontakt gekommen und konnte mich daher in meiner Jugend ganz auf den Alkohol konzentrieren. Bin nun seit fast 40 Jahren programmiertechnisch konstant auf Anfänger-Level, konnte jedoch beim Thema Alkohol eine gewisse Virtuosität erreichen.
Irgendwas muss man ja gut können.
Antworten