1

Тема: AHK: sleep в пределах одного блока

Можно как-нибудь это сделать, чтобы другие блоки с sleep работали тоже?
Конкретизирую задачу примером:

Loop
{
PixelSearch,,,0,0
if errorlevel = 0
Send 1

PixelSearch,,,1,1
if errorlevel = 0
gosub Primer
sleep, 100
}
return

Primer:
{
Send 9
sleep, 500
Send 8
sleep, 500
Send 7
sleep, 300
Send 6
sleep, 100
Send 5
}
Return

Когда выполняется Primer, то sleep распространяется и на главный цикл под Loop.
Вопрос - можно ли сделать sleep (задержку) только в пределах блока Primer? Или есть альтернативный способ задавать ждать 500 мс, затем 500 мс, затем 300 мс и т.д. ?

2

Re: AHK: sleep в пределах одного блока

Когда выполняется Primer, то sleep распространяется и на главный цикл под Loop.
Вопрос - можно ли сделать sleep (задержку) только в пределах блока Primer?

Команда gosub Primer прерывает поток цикла Loop; начинает исполняться подпрограмма Primer:. В AutoHotkey нет параллельных потоков (см. раздел "Потоки"), поэтому sleep делает временную паузу во всём скрипте.

3 (изменено: serzh82saratov, 2014-07-24 11:54:23)

Re: AHK: sleep в пределах одного блока


Arr := [["9", 500], ["8", 500], ["7", 300], ["6", 100], ["5", 0]]  
N := 0

Loop
{
    ToolTip % A_Index "|" A_TickCount, 111, 111, 1
    If !N 
        GoSub, LoopSend
}

LoopSend: 
    If !(N := ++N > Arr.MaxIndex() ? 0 : N)
        Return
    SetTimer, LoopSend, % "-" . Arr[N, 2] 
    ToolTip % Arr[N, 1] "|" Arr[N, 2], 111, 222, 2
    Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4 (изменено: Странникх, 2014-07-24 12:11:02)

Re: AHK: sleep в пределах одного блока

serzh82saratov, можете с детальными комментариями написать? Тяжело понять если честно.

5

Re: AHK: sleep в пределах одного блока

А что именно не ясно? Таймер запускает метку один раз, с периодом который второй параметр в перебираемых массивах ["9", 500], и нажимает кнопку которая первая ["9", 500].

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6 (изменено: Странникх, 2014-07-24 12:16:43)

Re: AHK: sleep в пределах одного блока

serzh82saratov пишет:

А что именно не ясно? Таймер запускает метку один раз, с периодом который второй параметр в перебираемых массивах ["9", 500], и нажимает кнопку которая первая ["9", 500].

Да вообще больше половина кода не ясна. Если начну перечислять, то выйдет не красиво по виду.

Если не затруднит напишите детальные комментарии.

7 (изменено: serzh82saratov, 2014-07-24 12:29:34)

Re: AHK: sleep в пределах одного блока


Arr := [["9", 500], ["8", 500], ["7", 300], ["6", 100], ["5", 0]]  
N := 0

Loop
{
    ToolTip % A_Index "|" A_TickCount, 111, 111, 1
    If !N ; Если в данный момент массив неперебирается, то запускаем метку. Также есть возможность прерывать текущее выполнение, начиная сначала подпрограмму
        GoSub, LoopSend
}

LoopSend: 
    If !(N := ++N > Arr.MaxIndex() ? 0 : N) ; Плюсуем к N единицу, если достигли конца массива, то назначаем N в 0, и прекращаем выполнение
        Return
    SetTimer, LoopSend, % "-" . Arr[N, 2] ; Назначаем однократный таймер равный 2 параметру в N массиве 
    SendInput % Arr[N, 1] ; Нажимаем кнопку которая в 1 параметре текущего массива
    Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

8 (изменено: Странникх, 2014-07-24 12:48:13)

Re: AHK: sleep в пределах одного блока

111, 111, 1

А вот это что такое после ToolTip % A_Index "|" A_TickCount?

9 (изменено: serzh82saratov, 2014-07-24 12:57:11)

Re: AHK: sleep в пределах одного блока

А это уже глупый вопрос.
Простейшие параметры команды ToolTip описаны в справке.

X, Y
Х и Y позиция подсказка относительно активного окна (использовать CoordMode, подсказка, чтобы изменить экранные координаты). Если координаты опущены, подсказка будет показан рядом с курсором мыши. Х и Y могут быть выражениями.
WhichToolTip
Пропустите этот параметр, если вам не нужно несколько подсказок появляться одновременно. В противном случае, это число от 1 до 20, чтобы указать, какие подсказки окно для работы на. Если не указано, что число 1 (первый). Этот параметр может быть выражением.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

10

Re: AHK: sleep в пределах одного блока

Так, вроде бы понятно, но конкретной задачи это не решает. Он лишь под цифры.

А если скажем я захочу сделать перебор с gui типа:?

guicontrol, 1: show, text
sleep, 500
guicontrol, 2: Hide, text

11

Re: AHK: sleep в пределах одного блока

Чего?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

12

Re: AHK: sleep в пределах одного блока

Timer: 
{
GuiControl, 2: Show, TimerText25
sleep, 500
GuiControl, 2: Hide, TimerText25
GuiControl, 2: Show, TimerText20
sleep, 500
GuiControl, 2: Hide, TimerText20
GuiControl, 2: Show, TimerText15
sleep, 500
GuiControl, 2: Hide, TimerText15
GuiControl, 2: Show, TimerText10
sleep, 400
GuiControl, 2: Hide, TimerText10
GuiControl, 2: Show, TimerText06
sleep, 300
GuiControl, 2: Hide, TimerText06
GuiControl, 2: Show, TimerText03
sleep, 100
GuiControl, 2: Hide, TimerText03
GuiControl, 2: Show, TimerText02
sleep, 100
GuiControl, 2: Hide, TimerText02
GuiControl, 2: Show, TimerText01
sleep, 100
GuiControl, 2: Hide, TimerText01
Gui, 2: Hide
time = 0
}
Return

Вот мой кусок кода, чей поток должен быть отделен от другого потока, либо иметь альтернативную паузу заместо sleep, не мешающей работать другим потокам (не останавливать работу других потоков).

13 (изменено: Malcev, 2014-07-24 13:57:50)

Re: AHK: sleep в пределах одного блока

Как заметил ypppu:

В AutoHotkey нет параллельных потоков

Хотите мультипоточность создавайте 2 скрипта и между ними обменивайтесь информацией.
Про псевдомультипоточность тут разбирались:
http://forum.script-coding.com/viewtopic.php?id=6406

14

Re: AHK: sleep в пределах одного блока

Ну.. да, в принципе можно создать кучу AHK скриптов, которые открывались бы и закрывались бы, чтобы не забивать этим трей.
Но я все равно буду искать ближайшее время решение, чтобы уместить все в одном скрипте. О и да пока писал кажется его нашел! Называется установка кучи таймеров с разным временем ожидания, то есть:

SetTimer, sleeper500, 500
sleeper500:
if x = 0
{
GuiControl, 2: Show, TimerText25
x = 1
Return ; Вот отсюда таймер запустится в 500 мс. Грубо говоря он подождет 500 мс, так как было бы написав sleep, 500 и приступит к выполнению дальше (то есть где x = 1)
}
if x = 1
{
GuiControl, 2: Hide, TimerText25
GuiControl, 2: Show, TimerText20
}
} ; Ну аналогию Вы дальше поняли

15 (изменено: Malcev, 2014-07-24 14:12:40)

Re: AHK: sleep в пределах одного блока

Почитайте внимательно ссылку в 13 посте.
Александр_ там все по полочкам раскладывает.

чтобы не забивать этим трей

http://www.script-coding.com/AutoHotkey/NoTrayIcon.html

16

Re: AHK: sleep в пределах одного блока

Да, но мне не нравится факт того, что нужно иметь вместо одного файла в папке четыре, а то и больше. Я преследую цель - упростить все. Не люблю трудности, как по себе человек простой.

17 (изменено: Malcev, 2014-07-24 14:52:39)

Re: AHK: sleep в пределах одного блока

Одним файлом можно создавать остальные, запускать их и при выходе из скрипта стирать.
А можно и отдельный процесс создать внутри скрипта, но выглядить будет сложнее:
http://forum.script-coding.com/viewtopi … 427#p65427

18

Re: AHK: sleep в пределах одного блока

Создавать тоже интересный способ и по началу я даже хотел все переписать с SetTimer'ов, но в результате выходит примерно также по сложности.

Самый простой вариант из всего - иметь уже созданные файлы и загружать их тогда, когда они нужны.

19

Re: AHK: sleep в пределах одного блока

Malcev пишет:

А можно и отдельный процесс создать внутри скрипта, но выглядить будет сложнее:

Думаю так будет проще http://forum.script-coding.com/viewtopi … 612#p84612, так и файлы не надо ни создавать ни удалять, и файл скрипта только один.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

20 (изменено: serzh82saratov, 2014-07-24 16:36:35)

Re: AHK: sleep в пределах одного блока

А также плюс, то что код будет не ввиде переменной, а в обычном виде. Всё включая Main: это стандартная шапка в которой не надо разбиратся, далее пишем сколько угодно меток. При закрытии или перезагрузке основного скрипта, остальные тоже закрываются моментально.


#NoTrayIcon
#SingleInstance Off 

WM_CloseMyScript := DllCall("RegisterWindowMessage", "Str", "CloseAHKScripts")
OnMessage(WM_CloseMyScript, "WM_CloseMyScript")
OnExit, CloseAll
Param = %1% 
If Param =
    PostMessage, WM_CloseMyScript, 0, A_ScriptHWND,, ahk_id 0xFFFF 
GoTo % IsLabel(Param) ? Param : "Main" 

WM_CloseMyScript(wParam, lParam)   { 
    If (lParam != A_ScriptHWND)  {
        OnExit
        ExitApp
    }
    return true
}

Esc::
CloseAll:
    PostMessage, WM_CloseMyScript, 0, A_ScriptHWND,, ahk_id 0xFFFF
    ExitApp
    
    
Main:
    Menu, Tray, Icon
    Loop
    {
        ToolTip % A_Index "|" A_TickCount 
        If !Mod(A_Index, 100) ; тут любое условие
        { 
            Process, Exist, %Pid_Send% ; это для того чтобы не запустить, если скрипт ещё не закрылся. Если оно конечно нужно.
            If (Pid_Send = "" || !ErrorLevel)
                Run, %A_ScriptFullPath% Send, , , Pid_Send 
        }
    }
 
Send:
    Send 9
    sleep, 500
    Send 8
    sleep, 500
    Send 7
    sleep, 300
    Send 6
    sleep, 100
    Send 5
    OnExit
    ExitApp

С командой GuiControl конечно не выйдет, но можно в параметрах ком строки передавать хэндлы нужных контролов, и делать тоже самое командами Control*.
Если во вторичных скриптах перед ExitApp не прописать OnExit, то все скрипты будут закрыты, что в некоторых случаях может быть удобно.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

21

Re: AHK: sleep в пределах одного блока

Чувствую, это будут часы-таймер на 12400 строк.