![]() |
как поставить скрипт в очередь ?
есть у меня скрипт на autoit который может быть запущен несколько раз в то время пока первый еще не успел отработать до конца. И мне нужно что бы они как бы в очередь вставали. Работать параллельно им нельзя и сбрасывать те что запущены тоже нельзя.
Есть способ _Singleton() что бы узнать, что уже запущен скрипт, если бы можно было только 2 экземпляра запустить то я бы просто проверку в цикл поставил, но когда их может быть несколько все становится сложнее. Нужно знать длину очереди и номер в очереди, тут я малость встал. Может есть какие идеи ? |
При запуске приложения проверяйте наличие процессов с тем же именем (исключая, естественно, сам текущий экземпляр приложения), получите их PID'ы, следите за процессом с наивысшим PID'ом, и ждите, пока он не будет завершён. |
Цитата:
|
Цитата:
Я не находил информацию, как подтверждающую, либо опровергающую ранее приведённое предположение. Буду рад, ежели кто поделится. |
проверяю
запускаю калькулятор PID 2148, затем блокнот PID 5120 закрываю калькулятор и блокнот снова запускаю калькулятор PID 5632, затем блокнот PID 2296 а самый высокий PID у pythonw.exe 6140, а запущен он еще утром так что по PID не отследить |
В общем вот что у меня получилось:
Код:
$iQueue_Position = _AppSetQueue(500) |
упс, не обновил страницу. а тут уже кучу всего написали ))
я так понимаю тут временные файлы используются ? мне приходила в голову идея с файлами, но не хотелось мучить ssd и я на эту идею подзабил. |
Цитата:
Делается это для того, чтобы запустить дополнительный (промежуточный-нейтральный) скрипт, который действует как хранилище для очереди запускаемых копий скриптов. |
а вы можете описать поподробней как там все работает. честно говоря код сложноват для меня.
|
Цитата:
При повторном запуске скрипт дописывает в этот самый Edit-элемент себя как ожидающего очереди, и ждёт пока эта очередь до него дойдёт (пока в списке Edit он не будет первым). Когда скрипт завершает свою работу, он удаляет себя из списка очереди, корректируя список. Цитата:
Там где MsgBox, это и есть тело вашего скрипта. Немного подправил код. |
Вот более простой скрипт (не использует временных файлов):
Код:
$iQueue_Position = _AppSetQueue(100) |
был бы признателен за объяснение что тут и как .
я полез в функцию _Singleton() которой определяется запущен ли уже скрипт или нет и выяснил, что она работает за счет создания у процесса неких mutant. Не совсем понимаю что это и для чего, но тем не менее с помощью них было бы очень удобно все сделать, если бы не одно но, при проверке на наличие у процесса этого mutant если его нет функция его создает, а как просто проверить есть или нет я не знаю. Если бы можно было это делать, то можно было бы хранить номер в очереди у каждого процесса. |
Цитата:
Каждый запущенный скрипт получает „билетик“, для этого используется встроенное окно AutoIt (см. AutoItWinGetTitle). Далее проверяются все окна от процессов нашего скрипта, и если скрипт на очереди (первый в списке), то продолжается (выполняется) его работа. Цитата:
Пример выше разве не работает? |
ну у меня скрипт без окон.
и самое главное они запускаются на терминальном сервере, и в результате скрпты всех пользователей в очередь встают, а надо чтоб очередь создавалась у каждого пользователя своя. с помощью _Singleton() легко отслеживается процесс от текущего пользователя, если делать к примеру так _Singleton($sProIDText & @UserName, 1) |
Цитата:
Цитата:
Можно попробовать так: Код:
#include "WinAPIEx.au3" ;http://autoit-script.ru/index.php/topic,47.0.html |
Цитата:
спасибо |
И я поправил.
|
Время: 13:00. |
Время: 13:00.
© OSzone.net 2001-