Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] как поставить скрипт в очередь ?

Ответить
Настройки темы
[решено] как поставить скрипт в очередь ?

Старожил


Сообщения: 440
Благодарности: 12

Профиль | Отправить PM | Цитировать


есть у меня скрипт на autoit который может быть запущен несколько раз в то время пока первый еще не успел отработать до конца. И мне нужно что бы они как бы в очередь вставали. Работать параллельно им нельзя и сбрасывать те что запущены тоже нельзя.
Есть способ _Singleton() что бы узнать, что уже запущен скрипт, если бы можно было только 2 экземпляра запустить то я бы просто проверку в цикл поставил, но когда их может быть несколько все становится сложнее.
Нужно знать длину очереди и номер в очереди, тут я малость встал.
Может есть какие идеи ?

Отправлено: 12:20, 16-01-2012

 

Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить 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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 04:50, 17-01-2012 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 440
Благодарности: 12

Профиль | Отправить PM | Цитировать


был бы признателен за объяснение что тут и как .

я полез в функцию _Singleton() которой определяется запущен ли уже скрипт или нет и выяснил, что она работает за счет создания у процесса неких mutant. Не совсем понимаю что это и для чего, но тем не менее с помощью них было бы очень удобно все сделать, если бы не одно но, при проверке на наличие у процесса этого mutant если его нет функция его создает, а как просто проверить есть или нет я не знаю. Если бы можно было это делать, то можно было бы хранить номер в очереди у каждого процесса.

Отправлено: 12:42, 17-01-2012 | #12


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата mitiya:
был бы признателен за объяснение что тут и как »
Я использовал „систему билетов“, как это сделано например в поликлинике

Каждый запущенный скрипт получает „билетик“, для этого используется встроенное окно AutoIt (см. AutoItWinGetTitle).
Далее проверяются все окна от процессов нашего скрипта, и если скрипт на очереди (первый в списке), то продолжается (выполняется) его работа.

Цитата mitiya:
Если бы можно было это делать, то можно было бы хранить номер в очереди у каждого процесса. »
Спрашивается зачем?

Пример выше разве не работает?

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 13:22, 17-01-2012 | #13


Старожил


Сообщения: 440
Благодарности: 12

Профиль | Отправить PM | Цитировать


ну у меня скрипт без окон.
и самое главное они запускаются на терминальном сервере, и в результате скрпты всех пользователей в очередь встают, а надо чтоб очередь создавалась у каждого пользователя своя. с помощью _Singleton() легко отслеживается процесс от текущего пользователя, если делать к примеру так _Singleton($sProIDText & @UserName, 1)

Отправлено: 13:40, 17-01-2012 | #14


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата mitiya:
у меня скрипт без окон »
У AutoIt есть встроенное (скрытое) окно, его и использует моя функция.

Цитата 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
нужно подключить библиотеку WinAPIEx.au3.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Последний раз редактировалось Creat0R, 18-01-2012 в 09:03.

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:52, 17-01-2012 | #15


Старожил


Сообщения: 440
Благодарности: 12

Профиль | Отправить PM | Цитировать


Цитата Creat0R:
Вот это «самое главное» следует указывать в самом начале, при созданий темы. »
сам это упусти вначале

спасибо

Отправлено: 08:50, 18-01-2012 | #16


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


И я поправил.

Отправлено: 10:40, 18-01-2012 | #17



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] как поставить скрипт в очередь ?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Помогите поставить СКРИПТ!!! 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




 
Переход