1 (изменено: Странникх, 2015-07-23 18:23:21)

Тема: AHK: Динамическая метка

1::
x := 2
Return

2::
x := 1
Return

3::
Gosub Label%x%
Return

Label%x%:
if x = 1
MsgBox, 1
if x = 2
MsgBox, 2
Return

1) Как правильно осуществить написание данного кода?

2) Можно ли изменять A_Index в Loop?
Например, брать A_Index из одного цикла, вносить в переменную MaxIndex. А в другом Loop цикле написать "сброс" так:

 Loop
{
if MaxIndex >= A_Index 
A_Index := 1
}
Return

Добавлено:
С первым вопросом методом тыка разобрался:

1::
x := 2
Return

2::
x := 1
Return

3::
Gosub, "x"Label
Return

"x"Label:
if x = 1
MsgBox, 1
if x = 2
MsgBox, 2
Return

2 (изменено: Alectric, 2015-07-23 18:46:02)

Re: AHK: Динамическая метка

С первым вопросом методом тыка разобрался:

Тоже самое:

1::
x := 2
Return

2::
x := 1
Return

3::
Gosub,Label
Return

Label:
if x = 1
MsgBox, 1
if x = 2
MsgBox, 2
Return

Можно ли изменять A_Index в Loop?

Нельзя. Можно сохранять в переменную и делать с ней все что угодно.

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

3 (изменено: Доктор ТуамОсес, 2015-07-23 20:27:18)

Re: AHK: Динамическая метка

Ничо не понял! Объясните нормально что Вам нужно.

4 (изменено: Странникх, 2015-07-23 21:28:12)

Re: AHK: Динамическая метка

Тоже самое:

1::
x := 2
Return

2::
x := 1
Return

3::
Gosub,Label
Return

Label:
if x = 1
MsgBox, 1
if x = 2
MsgBox, 2
Return

Как тогда задать и запустить метку со значением переменной?

Label%Var%:

По второму вопросу: решил созданием переменной в виде счетчика цикла

5 (изменено: Malcev, 2015-07-23 22:39:00)

Re: AHK: Динамическая метка

1::
x := 1
Return

2::
x := 2
Return

3::
Gosub,Label%x%
Return

Label1:
MsgBox, 1
return
Label2:
MsgBox, 2
return

6

Re: AHK: Динамическая метка

А если этих меток 200, Вы все 200 будете переписывать?

3)Нужно задать BoxMonitor%Loop_Index%_SetTimer в время SetTimer, как это сделать?

%BoxMonitor%Loop_Index%_SetTimer%

В

SetTimer, monitor%Loop_Index%_timer, %BoxMonitor1_SetTimer%

7

Re: AHK: Динамическая метка

А зачем 200?
Можно использовать одну:

label:
if
...
else if
...
else
...

8

Re: AHK: Динамическая метка

На одну и ту же метку 2 таймера не поставить - новое значение перезапишет старое.

9 (изменено: yalanne, 2015-07-24 16:41:39)

Re: AHK: Динамическая метка

У SetTimer'ов время разное может быть?
Эти таймеры должны  при совпадении 2х и более запущенных таймеров, должны работать одновременно и не прерывать друг друга?

+ скрипт
x:=1,   Time := [5,10,5,10,5,10,5,10,5] , Timer := []
loop % Time.MaxIndex()
    Timer.Insert(1)
settimer monitor,100
1::
2::
3::
4::
5::
6::
7::
8::
9::
x:=A_ThisHotkey
if (Timer[x] = 1)
    Timer[x] -= Time[x]
return

monitor:
Timer_list := ""
;% (h)?(h:=0)
loop % Time.MaxIndex()
    if (((Timer[A_Index] < 1) and Timer[A_Index]++) ? "" : "") (Timer[A_Index] = 0)
        h := A_Index
;if !h
;    return
loop % Time.MaxIndex()
    Timer_list .= (Timer_list? "`n" : "") A_Index ")`t`t" Timer[A_Index]-1
tooltip % "Таймеры:`n" Timer_list "`nпосл-й таймер)`t" h

monitor1_timer, monitor2_timer и т.д они все структурой отличаются друг от друга? если нет то можно все под один шаблон сделать ведь.

10

Re: AHK: Динамическая метка

monitor1_timer, monitor2_timer и т.д они все структурой отличаются друг от друга? если нет то можно все под один шаблон сделать ведь.

Структура разная, в каждой созданной метке от индекса есть динамическая переменная, которая присваивает свое значение.

Вот пример реализации задачи, но почему-то в этом варианте второй заданный таймер начинает отсчет на исполнение после первого таймера.


#SingleInstance Force     
#NoEnv
ListLines Off   
#Persistent 
 
 


Loop_Index := 0
Loop 2
{
    Loop_Index++
x%Loop_Index% := 1
}
Return

1::
Global oTimers := [], Start := A_TickCount
;SetTimer("other_timer", "второй", 4000)
; SetTime := 
SetTimer("monitor_timer", Loop_Index, x%Loop_Index% * 2000)
SetTimer("monitor_timer", "четвёртый", 5000)
;SetTimer("monitor_timer", "третий", 4000)
Return

monitor_timer: 
    ; ToolTip % (A_TickCount - Start)//1000 "`n`n" A_ThisLabel
    MsgBox,, Label, % oTimers[oTimers.MinIndex()].Value "`n`n" (A_TickCount - Start)/1000 " sec`n`n" A_ThisLabel 
    Return

SetTimer(Label, Value, Time) {
    SetTimer, GoLabel, Off
    Set := Time 
    While oTimers.HasKey(Set)
        Set++ 
    oTimers[Set] := {Label:Label,Value:Value}
    SetTime := oTimers.MinIndex()
    ; SetTime := SetTime < 1 ? 1 : SetTime
    SetTimer, GoLabel, % "-" SetTime 
    Return
    
    GoLabel:
        Try GoSub, % oTimers[oTimers.MinIndex()].Label
        oTimers.Delete(oTimers.MinIndex()) 
        If !oTimers.MinIndex()
            Return
        SetTime := oTimers.MinIndex()
        ; SetTime := SetTime < 1 ? 1 : SetTime
        SetTimer, GoLabel, % "-" SetTime
        Return
} 

То, что подразумевается под "динамической" переменной:

x%Loop_Index% := 1

Сама "динамическая" метка от этого такая:

monitor_timer: 
index := oTimers[oTimers.MinIndex()].Value
var%index% := "unlock"
Return

Если было бы можно сделать так:

 SetTimer, monitor_timer%Loop_Index%, 1000
monitor_timer%Loop_Index%:

То было бы куда проще, но так, к сожалению, нельзя.

Все, что остается здесь дорешать:
1. Как одновременно задавать таймеры, чтобы второй запускался одновременно с первым, а не начинал свой отсчет после исполнения первого.
2. И чтобы второй таймер не прерывал первый, пока тот не закончит свое исполнение в заданном Label

11

Re: AHK: Динамическая метка

yalanne пишет:

У SetTimer'ов время разное может быть?
Эти таймеры должны  при совпадении 2х и более запущенных таймеров, должны работать одновременно и не прерывать друг друга?

Таймеры работают асинхронно, т.е. в разных потоках, но для гарантии в каждый таймер можно прописать.

LabelTimer:
Thread, NoTimers
  ; Тело таймера, т.е. что он делает
Thread, NoTimers, False
Return
"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

12 (изменено: yalanne, 2015-07-30 15:35:49)

Re: AHK: Динамическая метка

Global Atimer := [], ALabel := [],Lthread,Atime_start := []

1::
SetTimer("test", 1000)
SetTimer("test", 2000)
SetTimer("test2", 5000)
return

SetTimer(Label, Time){
Atimer.Insert(Time + A_TickCount),    ALabel.Insert(Label),    Atime_start.Insert(A_TickCount)
if (Atimer.MaxIndex() = 1)
    SetTimer Atimer_label,10
}

Atimer_label:
if (Atimer.MaxIndex() = 0)
    SetTimer Atimer_label,off

loop % Atimer.MaxIndex()
    if (A_TickCount > Atimer[A_Index]) and (A_TickCount < Atimer[A_Index]+20) and (Func(ALabel[A_Index]) != 0)
    {
    d++
    hFunc := RegisterCallback(ALabel[A_Index])
    DllCall("CreateThread", UInt, 0, UInt, 0, UInt, hFunc, UInt, 0, UInt, 0, UInt, 0)
    DllCall("TerminateThread", UInt, hFunc, UInt, 0) 
    DllCall("CloseHandle", UInt, hFunc)
    Lthread := A_Index
    }
if (Atimer.MaxIndex() = d)
    {
    sleep 20
    d:=0,Atimer := [], ALabel := [],Atime_start := []
    }
return

test(){
msgbox % Lthread ") " A_ThisFunc ") " A_TickCount - Atime_start[Lthread]
}

test2(){
msgbox % Lthread ") " A_ThisFunc ") " A_TickCount - Atime_start[Lthread]
}

Вот код. Вроде добился многопоточности, но каждый новый поток не на метку идет а на функцию.
И отчет всех таймеров идет в одном  через массив.

13

Re: AHK: Динамическая метка

yalanne пишет:

добился многопоточности

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

#Persistent
SetTimer, Timer1, -10
SetTimer, Timer2, -10
Return

Timer1:
   Loop  {
      ToolTip % "Таймер 1 — " A_Index, 300, 500
      Sleep, 500
   }
   Return
   
Timer2:
   Loop  {
      ToolTip % "Таймер 2 — " A_Index, 500, 500
      Sleep, 500
   }
   Return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

14 (изменено: yalanne, 2015-07-30 16:25:00)

Re: AHK: Динамическая метка

teadrinker, Вот. Тут 3 таймера.первый работает с aa1, второй с aa2 и третий показывает результат в тултип.

Global Atimer := [], ALabel := [],Lthread,Atime_start := []


1::
SetTimer("timer1", 0)
SetTimer("timer2", 0)
SetTimer("Get", 0)
return

SetTimer(Label, Time){
Atimer.Insert(Time + A_TickCount),    ALabel.Insert(Label),    Atime_start.Insert(A_TickCount)
if (Atimer.MaxIndex() = 1)
    SetTimer Atimer_label,10
}

Atimer_label:
if (Atimer.MaxIndex() = 0)
    SetTimer Atimer_label,off

loop % Atimer.MaxIndex()
    if (A_TickCount > Atimer[A_Index]) and (A_TickCount < Atimer[A_Index]+20) and (Func(ALabel[A_Index]) != 0)
    {
    d++
    hFunc := RegisterCallback(ALabel[A_Index])
    DllCall("CreateThread", UInt, 0, UInt, 0, UInt, hFunc, UInt, 0, UInt, 0, UInt, 0)
    DllCall("TerminateThread", UInt, hFunc, UInt, 0) 
    DllCall("CloseHandle", UInt, hFunc)
    Lthread := A_Index
    }
if (Atimer.MaxIndex() = d)
    {
    sleep 20
    d:=0,Atimer := [], ALabel := [],Atime_start := []
    }
return

timer1(){
settimer Timer1,10
}

timer2(){
settimer Timer2,10
}

Get(){
settimer Get,10
}


timer1:
aa1++
sleep 100
return

timer2:
aa2++
return

Get:
tooltip % aa1 "`n" aa2
return

Вот только в новом потоке не работают loop, sleep но если в том потоке запустить обычный таймер то норм).

Скрипт по идее еще сырой его надо дорабатывать.

15

Re: AHK: Динамическая метка

yalanne, нет, я имел в виду именно мои два таймера. Если нужно, можно представить их в виде функций, а не подпрограмм.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16

Re: AHK: Динамическая метка

Не знаю сдаюсь).