Denkfehler bei "nur eine Instanz erlauben"

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

Denkfehler bei "nur eine Instanz erlauben"

Beitrag von bin_neu_hier »

Hallo Leute,

muss nochmal ein Thema von hinten aufrollen. Mein Programmpaket besteht aus nunmehr 4 Teilen (4 Exe-Dateien), die auf den mehr oder weniger gleichen Datenbestand zugreifen und diesen manipulieren. Es ist wichtig, dass keines dieser Programme mit mehreren Instanzen laufen kann.

Habe dazu aus diesem Post viewtopic.php?f=16&p=260173#p260173 den Code verwendet und ein wenig angepasst, genaugenommen habe ich statt ursprünglich

Code: Alles auswählen

g_hMutexAppRunning = CreateMutex_( #Null, #Null, "Global\MyApplication1")
das hier eingebaut

Code: Alles auswählen

g_hMutexAppRunning = CreateMutex_( #Null, #Null, "Global\"+GetFilePart(ProgramFilename(),#PB_FileSystem_NoExtension))
, damit jedes Programm nur einmal starten kann. Funktioniert aber nur teilweise!

Code: Alles auswählen

Global g_hMutexAppRunning

Procedure AppInstanceExists()
   Protected bAppRunning = FALSE;
  g_hMutexAppRunning = CreateMutex_( #Null, #Null, "Global\"+GetFilePart(ProgramFilename(),#PB_FileSystem_NoExtension))
  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()
  End
EndIf
CloseHandle_(g_hMutexAppRunning)
Ich kann damit jedes Programm nur 1x vom Startmenü starten (so weit so gut). Aber 3 der 4 Progs sind auch vom 4. Prog per

Code: Alles auswählen

RunProgramm
zu starten und damit kann ich jedes der 3 Progs jeweils ein zweites Mal starten. Wie kann ich sicher verhindern, dass ein Prog mit mehr als nur 1 Instanz läuft?
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
chi
Beiträge: 90
Registriert: 17.05.2007 09:30
Wohnort: Linz - Austria

Re: Denkfehler bei "nur eine Instanz erlauben"

Beitrag von chi »

Code: Alles auswählen

g_hMutexAppRunning = CreateMutex_( #Null, #TRUE, "Global\MyApplication1")
https://docs.microsoft.com/en-us/window ... eatemutexw
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Denkfehler bei "nur eine Instanz erlauben"

Beitrag von Mijikai »

Beispiel:

Code: Alles auswählen

Procedure.i InstanceAlreadyExists(Mutex.s)
  Protected handle.i
  handle = CreateMutex_(#Null,#True,Mutex)
  If handle
    If GetLastError_() = #ERROR_ALREADY_EXISTS
      ReleaseMutex_(handle)
      CloseHandle_(handle)
      ProcedureReturn #True
    EndIf
    ProcedureReturn #False
  EndIf
  ProcedureReturn -1
EndProcedure
bin_neu_hier
Beiträge: 105
Registriert: 06.03.2019 21:52

Re: Denkfehler bei "nur eine Instanz erlauben"

Beitrag von bin_neu_hier »

Hallo chi und Mijikai,

vielen Dank für Eure Beiträge, aber mit beiden Ansätzen kann ich das Problem nicht lösen. Werde jetzt wahrscheinlich eine "Lockfile"-Lösung verfolgen.
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
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Denkfehler bei "nur eine Instanz erlauben"

Beitrag von Kiffi »

Je nachdem, wie Du Deine EXE mit RunProgram() aufrufst, werden Groß-/Kleinschreibung beachtet. Demzufolge ist dann auch der Mutex anders.

ein

Code: Alles auswählen

 ... "Global\" + LCase(GetFilePart(ProgramFilename(), #PB_FileSystem_NoExtension)))
sollte hier schon reichen.

Grüße ... Peter
Hygge
bin_neu_hier
Beiträge: 105
Registriert: 06.03.2019 21:52

Re: Denkfehler bei "nur eine Instanz erlauben"

Beitrag von bin_neu_hier »

Hallo Kiffi,

auch Dir besten Dank, aber das Problem bleibt auch damit bestehen. Habe Deinen Vorschlag ausprobiert, zusätzlich auch mit LCase im RunProgramm-Befehl - will nicht. Meine Process-Explorer Software zeigt die beiden Instanzen einmal als "eigenständigen Eintrag" und einmal als "Unter-Eintrag" des aufrufenden Programmes (sorry für die unprofessionelle Beschreibung). Evtl. sind das aber schon 2 verschiedene Programme für die Instanzprüfung und deswegen klappt es nicht.

Ist aber auch wurscht - habe eine Lockfile-Lösung geschrieben, funktioniert offenbar gut, wenn es auch nicht meine erste Wahl gewesen ist. Nach einen Systemabsturz, LaptopAkku leer, ..., wird es deswegen sicher Probleme geben. Dann braucht es wohl noch ein "DeLock"-Tool ...
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
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Denkfehler bei "nur eine Instanz erlauben"

Beitrag von Sicro »

Vielleicht hilft dir das Modul von ts-soft:
OnlyOne Module Crossplattform
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Antworten