I'm using a code similar to Marc's example for many times but now I'd like to add a simple restart function to the program which could be useful in certain situation (e.g. DPI settings change)...
Without a delay the mutex seems to be still present, a fixed delay would work but is not elegante.
So I thought doing a loop trying to create a mutex until it works or timeout is reached. But I am wrong, the last error stays frozen - so what is wrong here?
Code: Select all
Procedure Main(); Needs to be compiled to MyApp.exe
Protected s.s
n=Bool(ProgramParameter(0)=".")*16; Waits up to 1.5 seconds to see if no mutex is present...
If n
;Delay(1000); /// would work then
EndIf
Repeat
mutti=CreateMutex_(0,0,@"MyApp")
m=Bool(GetLastError_()=#ERROR_ALREADY_EXISTS)
s+Str(mutti)+": "+Str(m)+#CR$
If m
ReleaseMutex_(mutti)
CloseHandle(mutti)
Debug GetLastError_()
n-1
Delay(100)
Debug Str(n)+", "+Str(mutti)
EndIf
Until m=0 Or n<0
MessageRequester(Str(m)+", "+Str(n),s)
If m
ReleaseMutex_(mutti)
Else
OpenWindow(0,20,20,200,200,"")
ButtonGadget(1,20,20,160,40,"Restart")
ButtonGadget(2,20,120,160,40,"Quit")
Repeat
Select WaitWindowEvent()
Case #PB_Event_Menu,#PB_Event_Gadget
quit=EventMenu()
EndSelect
Until quit
If quit=1
RunProgram("MyApp.exe",".",".")
EndIf
EndIf
EndProcedure
Main()