Die Lösung um die eigene EXE nur einmal starten zu können kennt man ja (CreateMutex_() usw.)
Ich bauchte aber etwas, um dem DAU bei Bedarf die Ausführung von z.B. drei Instanzen zu erlauben, aber eben auch nicht mehr -
falls derjenige mal den Überblick verloren hat.

So folgend (als konstruiertes Beispiel) habe ich es dann gelöst:
Code: Alles auswählen
PrgName.s = "MeinProgramm1.0"
#MaxRunning = 3
*SHnd = OpenSemaphore_(#SEMAPHORE_ALL_ACCESS,0,@PrgName)
If *SHnd = #Null Or GetLastError_() <> 0
MessageRequester("Info:", " OpenSemaphore failed!" +Chr(13)+Chr(13) + " Erstelle jetzt neue Semaphore ...." )
*SHnd = CreateSemaphore_(#Null,0,#MaxRunning-1,@PrgName)
If *SHnd <> 0 And GetLastError_() = #ERROR_ALREADY_EXISTS
MessageRequester("Achtung:", " Konnte Semaphore nicht erstellen!")
CloseHandle_(*SHnd) : End
EndIf
Else
If ReleaseSemaphore_(*SHnd,1,#Null) = 0 ; Semaphore +1
MessageRequester("Achtung:", " Dieses Programm wurde schon zu oft gestartet!")
CloseHandle_(*SHnd) : End
EndIf
EndIf
; ----------------------------------------------------------------------------
hwnd = OpenWindow(0,#PB_Ignore,#PB_Ignore,200,100,"Test - " + Str(#MaxRunning) + " instances allowed")
TextGadget(0,10,10,100,20,"Hallo")
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
WaitForSingleObject_(*SHnd,1) : CloseHandle_(*SHnd)
End
Frage2: Kann ich den aktuellen Zählerstand der Semaphore ermitteln? (Für Info im Fenster wieviele Programminstanzen laufen z.B.)