rudi Posted July 24, 2019 Posted July 24, 2019 @guinness mentioned in a different thread an Approach, I honestly do not 100% how to use it. I have a script, that shall run on one Windows box only once. If started more than once, it shall not Exit itself, but kill the other processes using the same _Singleton "$sOccurrenceName". So what I would Need is the PID(s) of the *OTHER* instances, that use the same "$sOccurrenceName". This may be from a different logon ("global\"), and the @scriptname might be different, too. (someone might rename the EXE, for what sensless reason whatsoever...) TIA, Rudi. Earth is flat, pigs can fly, and Nuclear Power is SAFE!
Nine Posted July 24, 2019 Posted July 24, 2019 @AutoItPID will give you the current pid of your script. Then use ProcessExists in a loop to check if a process of the same name exists with a different pid than the current. If so use ProcessClose to kill it. “They did not know it was impossible, so they did it” ― Mark Twain Spoiler Block all input without UAC Save/Retrieve Images to/from Text Monitor Management (VCP commands) Tool to search in text (au3) files Date Range Picker Virtual Desktop Manager Sudoku Game 2020 Overlapped Named Pipe IPC HotString 2.0 - Hot keys with string x64 Bitwise Operations Multi-keyboards HotKeySet Recursive Array Display Fast and simple WCD IPC Multiple Folders Selector Printer Manager GIF Animation (cached) Debug Messages Monitor UDF Screen Scraping Round Corner GUI UDF Multi-Threading Made Easy Interface Object based on Tag
mikell Posted July 24, 2019 Posted July 24, 2019 I personally use this (found somewhere on this forum) While Singleton doesn't allow a 2nd instance, this one allows the new one and kills the previous ones Func _killOriginal($winTitle) Local $processID = WinGetProcess($winTitle) While WinExists($winTitle) WinClose($winTitle) Sleep(10) ; allow window to exit ProcessClose($processID) Sleep(10) ; allow process to exit WEnd EndFunc ;==>_killOriginal t0nZ 1
Exit Posted July 24, 2019 Posted July 24, 2019 (edited) Maybe this UDF can help: _SingleScript() Close all executing scripts with the same name and continue. or Wait for completion of predecessor scripts with the same name. or Exit if other scripts with the same name are executing. or Test, if other scripts with the same name are executing. http://www.autoitscript.com/forum/index.php?showtopic=178681 However, it only works if the script name is identical. But it takes into account xxx.exe and xxx.au3 at the same time. Edited July 24, 2019 by Exit App: Au3toCmd UDF: _SingleScript()
rudi Posted July 25, 2019 Author Posted July 25, 2019 Hello, thanks for all your replies. My question was not precisely enough: _Singleton() is using a descriptive "NAME", that is fixed compiled into the EXE file. So that "NAME" will be always the same, even when the EXE file has been renamed. The Process Name, that's addressed through all the Process*() functions is always the *NAME OF THE EXE FILE*. What I'm looking for is a list of all the processes, that "have" the same SingletonName, as defined in that line _Singleton("SingletonName",1) as that one will remain untouched, when the EXE file is renamed. Basically something like a function $aSiToList=_SingletonList("SingletonName"), like it's done by $aProcList=ProcessList("EXE-File-Name") Earth is flat, pigs can fly, and Nuclear Power is SAFE!
RTFC Posted July 25, 2019 Posted July 25, 2019 It doesn't work that way. AutoIt's Singleton creates a mutex, a uniquely-named object within the OS; think of it as a user-named flag, usually initially set to busy by the mutex creator (a process or thread). Any other process attempting to create the exact same object while it exists will fail, in the sense that the handle to the existing mutex is returned, along with an error code. Only the creator (or higher authority) can destroy that mutex. The flag itself has no awareness of anything; no queue of which processes/threads are using it, nothing, so this cannot be returned by the OS either. Secondly, the flag does not prevent any access itself; it is a voluntary signalling device between concurrent threads/processes; each one needs to be aware of its existence and query it to obtain ownership to avoid potential race conditions. Maybe a better solution is to create a Registry entry to which each instance of your process adds (and removes) its own key (process name) or something. My Contributions and Wrappers Spoiler BitMaskSudokuSolver BuildPartitionTable CodeCrypter CodeScanner DigitalDisplay Eigen4AutoIt FAT Suite HighMem MetaCodeFileLibrary OSgrid Pool RdRand SecondDesktop SimulatedAnnealing Xbase I/O
Deye Posted July 26, 2019 Posted July 26, 2019 Hi rudi, just consider that once called (one time per a running script) your done using it. Here are some clues to make singleton work in a more flexible way (adjusted to your needs ++) Spoiler expandcollapse popup#AutoIt3Wrapper_Outfile=_Second.exe #include <Misc.au3> #include <Array.au3> #include <Process.au3> If Not @Compiled Then Exit MsgBox(262144, '', "Remember to first compile !!") $Singleton = 9999 _QueuSingleton() Func _QueuSingleton() Do $Singleton -= 1 Until _Singleton($Singleton, 1) $Singleton += 1 Local $sMyAutoItTitle = "Unique_" & $Singleton AutoItWinSetTitle($sMyAutoItTitle) Local $sPN = _ProcessGetName(WinGetProcess($sMyAutoItTitle)) If $Singleton = 9999 Then Local $a While 1 $a = ProcessList($sPN) _ArrayColDelete($a, 0) $sMsg = '"' & $sPN & " Title : " & $sMyAutoItTitle & '" : ' & UBound($a) - 1 & " PIDS: " & @LF & _ArrayToString($a) If UBound($a) > 2 Then MsgBox(0, 'Message From first instance', $sMsg, 3) Else MsgBox(0, 'Message From first instance', $sMsg & _ @LF & @LF & "Dont close me yet" & @CRLF & "Go Start a few more instance of me", 5) EndIf WEnd EndIf MsgBox(0, $sPN, "Will auto exit in 10 seconds" & @CRLF & @CRLF & "I Am " & $sMyAutoItTitle & @CRLF & "PID :" & @AutoItPID, 3) Sleep(7000) EndFunc ;==>_QueuSingleton Deye
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now