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

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

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

Старожил


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

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


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

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

 

Ветеран


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

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


Можно воспользоваться тем, что PID'ы растут последовательно.

При запуске приложения проверяйте наличие процессов с тем же именем (исключая, естественно, сам текущий экземпляр приложения), получите их PID'ы, следите за процессом с наивысшим PID'ом, и ждите, пока он не будет завершён.

Последний раз редактировалось Iska, 18-01-2012 в 10:38. Причина: Предположение не подтвердилось


Отправлено: 14:10, 16-01-2012 | #2



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

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


Аватара для Creat0R

Must AutoIt


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

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


Цитата Iska:
Можно воспользоваться тем, что PID'ы растут последовательно. »
Вообще то нет, есть у меня в процессах старые процессы с меньшим большим значением у PID.

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

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

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, 16-01-2012 в 20:52.


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


Ветеран


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

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


Цитата Creat0R:
с меньшим значением у PID. »
С большим, наверное?

Я не находил информацию, как подтверждающую, либо опровергающую ранее приведённое предположение. Буду рад, ежели кто поделится.

Отправлено: 17:33, 16-01-2012 | #4


Аватара для ferget

Разный


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

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


проверяю

запускаю калькулятор PID 2148, затем блокнот PID 5120

закрываю калькулятор и блокнот

снова запускаю

калькулятор PID 5632, затем блокнот PID 2296

а самый высокий PID у pythonw.exe 6140, а запущен он еще утром

так что по PID не отследить

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


Аватара для Creat0R

Must AutoIt


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

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


В общем вот что у меня получилось:

Код: Выделить весь код
$iQueue_Position = _AppSetQueue(500)
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 = 500, $iOnStart = 1)
; Parameters.....: $iWait [Optional] - Wait between each queue check (default is 500 ms).
;                  $iOnStart [Optional/Internal] - Indicates if the function was executed on start, only internal usage.
;
;
; Return values..: Success - Return Queue position (-1 if this is the first instance of the program).
;                  Failure - None.
; Author.........:    G.Sandler (CreatoR)
; Modified.......:
; Remarks........:
; Related........:
; Link...........:
; Example........:
; ===============================================================================================================
Func _AppSetQueue($iWait = 500, $iOnStart = 1)
    Local $sUnique_Win, $sQueue, $aQueue, $iC, $sTmp_Script, $nEdit, $hFile, $iLast_Queue

    $sUnique_Win = "__Au3_Queue_Window__"
    $sQueue = ControlGetText($sUnique_Win, "", "Edit1")
    $aQueue = StringSplit($sQueue, @CRLF, 1)

    ;The script Exits (called by OnAutoItExitRegister)
    If Not IsDeclared("iOnStart") Then
        $sQueue = ""
        $iC = 0

        For $i = 1 To $aQueue[0]
            If Not StringRegExp($aQueue[$i], '^\d+:' & @AutoItPID) Then
                $iC += 1
                $sQueue &= $iC & ":" & StringRegExpReplace($aQueue[$i], '^\d+:', '') & @CRLF
            EndIf
        Next

        $sQueue = StringStripWS($sQueue, 3)
        ControlSetText($sUnique_Win, "", "Edit1", $sQueue)
        Return
    EndIf

    OnAutoItExitRegister("_AppSetQueue")

    If Not WinExists($sUnique_Win) Then
        $sTmp_Script = _
            '#NoTrayIcon' & @CRLF & _
            'GUICreate("' & $sUnique_Win & '", 100, 20)' & @CRLF & _
            '$nEdit = GUICtrlCreateEdit("1:' & @AutoItPID & '", 0, 0, 100, 20)' & @CRLF & @CRLF & _
            'While GUICtrlRead($nEdit) <> ""' & @CRLF & _
            '    Sleep(100)' & @CRLF & _
            'WEnd' & @CRLF & @CRLF & _
            'FileDelete(@TempDir & "\~tmp_GUI_src.tmp")' & @CRLF & _
            'Run(@ComSpec & '' /C Del /F /Q "'' & @TempDir & ''\~tmp_GUI.tmp"'', '''', @SW_HIDE)' & @CRLF & _
            'Exit' & @CRLF

        $hFile = FileOpen(@TempDir & "\~tmp_GUI_src.tmp", 2)
        FileWrite($hFile, $sTmp_Script)
        FileClose($hFile)

        FileCopy(@AutoItExe, @TempDir & "\~tmp_GUI.tmp", 1)
        Run(@TempDir & '\~tmp_GUI.tmp /AutoIt3ExecuteScript "' & @TempDir & '\~tmp_GUI_src.tmp"')

        Return -1
    EndIf

    $iLast_Queue = Number(StringRegExpReplace($aQueue[$aQueue[0]], '^(\d+)', '\1'))
    $sQueue &= @CRLF & $iLast_Queue + 1 & ":" & @AutoItPID
    ControlSetText($sUnique_Win, "", "Edit1", $sQueue)

    While 1
        $sQueue = ControlGetText($sUnique_Win, "", "Edit1")
        $aQueue = StringSplit($sQueue, @CRLF, 1)

        If StringRegExp($aQueue[1], '^\d+:' & @AutoItPID) Then
            Return $aQueue[0] ;It' our turn in the queue
        EndIf

        Sleep($iWait)
    WEnd
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


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

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

Отправлено: 21:11, 16-01-2012 | #6


Старожил


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

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


упс, не обновил страницу. а тут уже кучу всего написали ))

я так понимаю тут временные файлы используются ?
мне приходила в голову идея с файлами, но не хотелось мучить ssd и я на эту идею подзабил.

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


Аватара для Creat0R

Must AutoIt


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

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


Цитата 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


Отправлено: 02:08, 17-01-2012 | #8


Старожил


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

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


а вы можете описать поподробней как там все работает. честно говоря код сложноват для меня.

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


Аватара для Creat0R

Must AutoIt


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

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


Цитата mitiya:
как там все работает »
При первом запуске создаётся скрипт с окном и элементом Edit для хранения списка очереди.
При повторном запуске скрипт дописывает в этот самый Edit-элемент себя как ожидающего очереди, и ждёт пока эта очередь до него дойдёт (пока в списке Edit он не будет первым).
Когда скрипт завершает свою работу, он удаляет себя из списка очереди, корректируя список.

Цитата mitiya:
код сложноват для меня »
А всё что от вас требуется, так это помещение этого кода в начало вашего скрипта.
Там где MsgBox, это и есть тело вашего скрипта.

Немного подправил код.

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

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

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


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



Компьютерный форум 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




 
Переход