1

Тема: AHK: Рекурсивный вызов функции

Я для проверки написал такой скрипт

#Persistent
RShift::
 i+=10
 msgbox % i
 fn(i)
return

fn(a)
{
 static b:=0
 loop
  {
   b+=а
   tooltip %b%
  }
}

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

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

2 (изменено: Alectric, 2013-11-04 22:00:35)

Re: AHK: Рекурсивный вызов функции

Это из-за цикла в функции.

Так должно работать:

#Persistent
#SingleInstance,Force

RShift::
  i+=10
  msgbox % i
  fn(i)
return

fn(a)
{
  static b:=0
  settimer,loop,1
}


loop:
{
  b+=а
  tooltip %b%
}
return
Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

3 (изменено: Indomito, 2013-11-04 22:09:40)

Re: AHK: Рекурсивный вызов функции

Ну что? Что Loop, что Goto блокируют функцию, т е получается второго входа нельзя сделать пока не будет сделанl из функции по RETURN.

Можно конечно запустить таймер и выйти, т.е. создать новый поток, а в одном потоке повторный вход не возможен, так?

Alectric пишет:

Это из-за цикла в функции.

Так должно работать:

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

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

4

Re: AHK: Рекурсивный вызов функции

Рекурсивный — это вызов функции из неё самой. А вам, наверно, нужна директива #MaxThreadsPerHotkey.

5 (изменено: Irbis, 2013-11-04 22:12:12)

Re: AHK: Рекурсивный вызов функции

Вызвать хоткей несколько раз поможет #MaxThreadsPerHotkey, хотя особой пользы это не принесет.
btw, рекурсия - это несколько другое, в твоем примере ф-ия не вызывает саму себя.
upd: в общем, пока писал... смотри выше ))

6 (изменено: Alectric, 2013-11-04 22:32:04)

Re: AHK: Рекурсивный вызов функции

А почему "b" все время равно 0?


Leater:
Переменная "a" почему-то русская была...

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

7

Re: AHK: Рекурсивный вызов функции

YMP пишет:

А вам, наверно, нужна директива #MaxThreadsPerHotkey.

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

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

8

Re: AHK: Рекурсивный вызов функции

Alectric пишет:

А почему "b" все время равно 0?

просто в loop значение не может попасть, хотя функция вызывается.

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

9

Re: AHK: Рекурсивный вызов функции

Indomito пишет:

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

А что, не происходит разве? Всё равно из другого потока вызов имеется в виду, а не рекурсия. Этот вызов вклинится между командами функции первого вызова.

10 (изменено: Alectric, 2013-11-04 22:31:11)

Re: AHK: Рекурсивный вызов функции

Indomito пишет:
Alectric пишет:

А почему "b" все время равно 0?

просто в loop значение не может попасть, хотя функция вызывается.

Нет. Просто "а" напечатана на другой раскладке.

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

11 (изменено: Indomito, 2013-11-04 22:44:13)

Re: AHK: Рекурсивный вызов функции

Alectric пишет:

Нет. Просто "а" напечатана на другой раскладке.

ну, а так почему?

#Persistent
RShift::
 i+=10
 ;msgbox % i
 fn(i)
return

fn(sa)
{
 ;static b,ftm=false
 if (ftm)
      return
 ;ftm:=false
 settimer l , 10
 ftm:=!ftm
 return

 l:
   ;sasa:=sasa+sa
   sasa+=sa
   tooltip %sasa%
 return  
}

причём при sasa:=sasa+sa ничего не выводит, а при sasa+=sa выводит  0

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

12

Re: AHK: Рекурсивный вызов функции

Причём, если не делать функцию, а сделать подпрограмму, то всё работает и считается - вопрос почему?
Какая разница между Global и Static? Кроме их значений для функции?

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

13 (изменено: Indomito, 2013-11-05 08:25:56)

Re: AHK: Рекурсивный вызов функции

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

 fn(sa)
{
 static sasa:=0, sa1

 sa1:=sa

Роль независимого потока играет таймер, который считает всё что нужно посчитать, не зависимо от числа нажатий/вызова функции.
Задержки для того, что бы видеть - они функциональной роли не несут

+ открыть спойлер
#Persistent
RShift::
 sasa+=1
 fn(sasa)
 sleep 1000
return

fn(sa)
{
 static sasa:=0, sa1

 sa1:=sa
 if (ftm)
      return
 settimer tin , 300
 ftm:=true
 ;gosub tin <---- не обязательно, таймер будет работать пока не будет сделан выход из скрипта.
 return

 tin:
 sasa:=sasa+sa1 
   sleep 150
   tooltip %sasa%
 return  
}

и остался вопрос как записать тип переменной передаваемой в функцию - такое вот не проходит fn(static: sa:=0 )

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

14

Re: AHK: Рекурсивный вызов функции

В функцию передаются не переменные, а их значения или ссылки на них. Так что этот вопрос о типе смысла не имеет.

15

Re: AHK: Рекурсивный вызов функции

Спасибо за информацию.

Задачу я свою решил, т.е. написал скрипт, правда немного иным способом.

Вопрос - снят.

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