![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] как поставить скрипт в очередь ? |
|
[решено] как поставить скрипт в очередь ?
|
Старожил Сообщения: 440 |
есть у меня скрипт на autoit который может быть запущен несколько раз в то время пока первый еще не успел отработать до конца. И мне нужно что бы они как бы в очередь вставали. Работать параллельно им нельзя и сбрасывать те что запущены тоже нельзя.
Есть способ _Singleton() что бы узнать, что уже запущен скрипт, если бы можно было только 2 экземпляра запустить то я бы просто проверку в цикл поставил, но когда их может быть несколько все становится сложнее. Нужно знать длину очереди и номер в очереди, тут я малость встал. Может есть какие идеи ? |
|
Отправлено: 12:20, 16-01-2012 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Вот более простой скрипт (не использует временных файлов):
$iQueue_Position = _AppSetQueue(100) MsgBox(64, 'Title', StringFormat('Process: %i\nQueue position: %i', @AutoItPID, $iQueue_Position)) ; #FUNCTION# ==================================================================================================== ; Name...........: _AppSetQueue ; Description....: Sets Queue for the next instances of this script. ; Syntax.........: _AppSetQueue($iWait = 100) ; Parameters.....: $iWait [Optional] - Waiting queue (default is 500 ms). ; ; ; Return values..: Success - Return Queue position (0 if this is the first instance of the program). ; Failure - None. ; Author.........: G.Sandler (CreatoR) ; Modified.......: ; Remarks........: ; Related........: ; Link...........: ; Example........: ; =============================================================================================================== Func _AppSetQueue($iWait = 100) Local $sUnique_Win, $sScriptName, $aProcList, $aWinList, $iQueue, $hPrev_Queue_Win, $j $sUnique_Win = "_Au3_Queue_Window_" $sScriptName = @ScriptName If Not @Compiled Then $sScriptName = StringRegExpReplace(@AutoItExe, '^.*\\', '') EndIf $aProcList = ProcessList($sScriptName) $aWinList = WinList($sUnique_Win) $iQueue = 0 $hPrev_Queue_Win = 0 If UBound($aWinList) > 1 Then $hPrev_Queue_Win = $aWinList[1][1] EndIf For $i = 1 To UBound($aProcList)-1 For $j = 1 To UBound($aWinList)-1 If $aWinList[$j][0] = $sUnique_Win And WinGetProcess($aWinList[$j][1]) = $aProcList[$i][1] Then $iQueue += 1 If $j > 1 Then $hPrev_Queue_Win = $aWinList[$j-1][1] EndIf ExitLoop EndIf Next Next AutoItWinSetTitle($sUnique_Win & "__") ControlSetText($sUnique_Win & "__", "", "Edit1", $iQueue + 1) AutoItWinSetTitle($sUnique_Win) If $iQueue = 0 Then Return 0 EndIf While WinExists($hPrev_Queue_Win) Sleep($iWait) WEnd Return $iQueue EndFunc |
------- Отправлено: 04:50, 17-01-2012 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 440
|
Профиль | Отправить PM | Цитировать был бы признателен за объяснение что тут и как .
я полез в функцию _Singleton() которой определяется запущен ли уже скрипт или нет и выяснил, что она работает за счет создания у процесса неких mutant. Не совсем понимаю что это и для чего, но тем не менее с помощью них было бы очень удобно все сделать, если бы не одно но, при проверке на наличие у процесса этого mutant если его нет функция его создает, а как просто проверить есть или нет я не знаю. Если бы можно было это делать, то можно было бы хранить номер в очереди у каждого процесса. |
Отправлено: 12:42, 17-01-2012 | #12 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Цитата mitiya:
![]() Каждый запущенный скрипт получает „билетик“, для этого используется встроенное окно AutoIt (см. AutoItWinGetTitle). Далее проверяются все окна от процессов нашего скрипта, и если скрипт на очереди (первый в списке), то продолжается (выполняется) его работа. Цитата mitiya:
Пример выше разве не работает? |
||
------- Отправлено: 13:22, 17-01-2012 | #13 |
Старожил Сообщения: 440
|
Профиль | Отправить PM | Цитировать ну у меня скрипт без окон.
и самое главное они запускаются на терминальном сервере, и в результате скрпты всех пользователей в очередь встают, а надо чтоб очередь создавалась у каждого пользователя своя. с помощью _Singleton() легко отслеживается процесс от текущего пользователя, если делать к примеру так _Singleton($sProIDText & @UserName, 1) |
Отправлено: 13:40, 17-01-2012 | #14 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Цитата mitiya:
Цитата mitiya:
Можно попробовать так: #include "WinAPIEx.au3" ;http://autoit-script.ru/index.php/topic,47.0.html $iQueue_Position = _AppSetQueue(100) MsgBox(64, 'Title', StringFormat('Process: %i\nQueue position: %i', @AutoItPID, $iQueue_Position)) ; #FUNCTION# ==================================================================================================== ; Name...........: _AppSetQueue ; Description....: Sets Queue for the next instances of this script. ; Syntax.........: _AppSetQueue($iWait = 100, $sUserName = @UserName) ; Parameters.....: $iWait [Optional] - Waiting queue (default is 100 ms). ; $sUserName [Optional] - Limit queue for specfific system user. ; ; ; Return values..: Success - Return Queue position (0 if this is the first instance of the program). ; Failure - None. ; ; Author.........: G.Sandler (CreatoR) ; Modified.......: ; Remarks........: ; Related........: ; Link...........: ; Example........: ; =============================================================================================================== Func _AppSetQueue($iWait = 100, $sUserName = @UserName) Local $sUnique_Win, $sScriptName, $aProcList, $aWinList, $iQueue, $hPrev_Queue_Win, $aProcUser $sUnique_Win = "_Au3_Queue_Window_" $sScriptName = @ScriptName If Not @Compiled Then $sScriptName = StringRegExpReplace(@AutoItExe, '^.*\\', '') EndIf $aProcList = ProcessList($sScriptName) $aWinList = WinList($sUnique_Win) $iQueue = 0 $hPrev_Queue_Win = 0 If UBound($aWinList) > 1 Then $hPrev_Queue_Win = $aWinList[1][1] EndIf For $i = 1 To UBound($aProcList)-1 $aProcUser = _WinAPI_GetProcessUser($aProcList[$i][1]) If $aProcUser[0] <> $sUserName Then ContinueLoop EndIf For $j = 1 To UBound($aWinList)-1 If $aWinList[$j][0] = $sUnique_Win And WinGetProcess($aWinList[$j][1]) = $aProcList[$i][1] Then $iQueue += 1 If $j > 1 Then $hPrev_Queue_Win = $aWinList[$j-1][1] EndIf ExitLoop EndIf Next Next AutoItWinSetTitle($sUnique_Win & "__") ControlSetText($sUnique_Win & "__", "", "Edit1", $iQueue + 1) AutoItWinSetTitle($sUnique_Win) If $iQueue = 0 Then Return 0 EndIf While WinExists($hPrev_Queue_Win) Sleep($iWait) WEnd Return $iQueue EndFunc |
||
------- Последний раз редактировалось Creat0R, 18-01-2012 в 09:03. Отправлено: 22:52, 17-01-2012 | #15 |
Старожил Сообщения: 440
|
Профиль | Отправить PM | Цитировать Цитата Creat0R:
![]() спасибо |
|
Отправлено: 08:50, 18-01-2012 | #16 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать И я поправил.
|
Отправлено: 10:40, 18-01-2012 | #17 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Помогите поставить СКРИПТ!!! | MozgNeo | Вебмастеру | 29 | 29-09-2013 13:42 | |
Не очищается очередь печати | YDen | Microsoft Windows 95/98/Me (архив) | 7 | 01-06-2009 21:40 | |
RAID - Как поступить в первую очередь? с RAID 0 | AppleNTU | Накопители (SSD, HDD, USB Flash) | 7 | 29-01-2009 09:22 | |
Очередь печати | Mix Shumaher | Microsoft Windows NT/2000/2003 | 3 | 13-03-2006 23:06 | |
очередь печати | andyzu | Microsoft Windows 95/98/Me (архив) | 3 | 05-01-2004 09:44 |
|