PureBoard
http://forums.purebasic.com/german/

Frage zu "Nur eine Instanz erlauben"
http://forums.purebasic.com/german/viewtopic.php?f=16&t=31541
Seite 1 von 1

Autor:  bin_neu_hier [ 20.06.2019 14:46 ]
Betreff des Beitrags:  Frage zu "Nur eine Instanz erlauben"

Tach allerseits!

Habe eine Verständnisfrage zum Beitrag https://www.purebasic.fr/german/viewtopic.php?f=16&p=260173#p260173

Hier hat PureLust einen Beitrag von mk-soft folgendermaßen zusammengefasst:
Code:
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?

Autor:  RSBasic [ 20.06.2019 14:58 ]
Betreff des Beitrags:  Re: Frage zu "Nur eine Instanz erlauben"

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.

Autor:  NicTheQuick [ 20.06.2019 15:07 ]
Betreff des Beitrags:  Re: Frage zu "Nur eine Instanz erlauben"

@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.

Autor:  RSBasic [ 20.06.2019 15:32 ]
Betreff des Beitrags:  Re: Frage zu "Nur eine Instanz erlauben"

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.

Autor:  bin_neu_hier [ 20.06.2019 22:39 ]
Betreff des Beitrags:  Re: Frage zu "Nur eine Instanz erlauben"

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

Besten Dank!

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/