1

Тема: AHK: Reload и переменные

Иногда, при перезапуске скрипта по хоткею, переменные, заданные в начале скрипта вот в таком виде:

x_kadr:= 8

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

  Иногда 1 раз из 5 случается. А иногда и четыре раза подряд.

  Отчего может такое происходить?

  Спасибо за помощь!

2

Re: AHK: Reload и переменные

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

3 (изменено: Pokerist, 2012-04-11 02:57:42)

Re: AHK: Reload и переменные

Полный код - больше тысячи, мною написанных, корявых строк, в которых можно утонуть.  :/

  Переменные с координатами для  ImageSearch, которые объявляются практически в самом начале кода и вызываются почти сразу после объявления всех переменных УЖЕ пустые при вызове.


  Попробую привести структуру кода.



/*

комментарий

*/


;-----------------настройки
CoordMode, Mouse, Screen
CoordMode, Pixel, Screen
CoordMode, tooltip, Screen
SetMouseDelay 0.01
;-----------------настройки




;------------таймеры
SetTimer, tmr1, 200
SetTimer, ster, 5001


;------------таймеры



;-----------------пременные

x_kadr:= 8

...


na4alo:= [0, 0, 0, .... 1, 0] ; урезал для кратости

1_stroka:= "0;0;16;...;0;" ; урезал для кратости

ToolTip, % "Время:   " na4alo[1]  ... `n  Дата:  na4alo[4] , 100, 790, 6  ; урезал для кратости


pause  ; остановка после старта и перезагрузки




zikl: 

x_sm:= 74  
y_sm:= 20

...  ; ещё с полста переменных, включая  примерно 20 массивов типа:

xt5:=[5, 66, 76, 116, 156, 197, 265, 304, 344, 383, 453, 463] 

; конец объявления переменных





tmr1:
loop, 1
{    
ToolTip, %  x_kadr  ; УЖЕ ЗДЕСЬ ПЕРЕМЕННАЯ ОКАЗЫВАЕТСЯ ПУСТОЙ!


...  ; продолжение на 600 строк


^<::
ToolTip,,,,
Reload
Return

+<::
Pause, Toggle
Return

; конец

4

Re: AHK: Reload и переменные

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

5

Re: AHK: Reload и переменные

Практически сразу же как видно из приведенного отрыка кода.  Думаю тут дело в каком-то несовпадении действий таймера и момента перезагрузки скрипта.  Может такое быть? И главное как исправить?

6

Re: AHK: Reload и переменные

Не удалось повторить ошибку с предложенным вариантом кода. Скорее всего, причина ее кроется среди "больше тысячи, мною написанных, корявых строк..."
Если скрипт нормально работает при первом запуске, попробуй перезапускать его так:
В начале кода

#SingleInstance force

А вместо Reload

Run, %A_ScriptFullPath%

Не знаю, поможет или нет, по идее варианты идентичны, но попытка - не пытка. А так, скорее всего, проблему надо искать в другом месте.

7

Re: AHK: Reload и переменные

Irbis пишет:

Не удалось повторить ошибку с предложенным вариантом кода.

А Вы пробовали, как я, после перезагрузки по хоткею, снять паузу хоткеем?

 


Если скрипт нормально работает при первом запуске.

Специально провёл тест,  оказалось, что тоже не всегда. 


Скорее всего, причина ее кроется среди "больше тысячи, мною написанных, корявых строк..."

Не исключено. Но вот я сейчас изменил частоту срабатывания таймера на
   

SetTimer, tmr1, 1200

И ошибка стала появляться раз в 5 реже. Значит всё на него завязано.

  Вот ещё что. Есть в коде несколько GOTO, которые отсылают к той же метке, что и этот таймер : tmr1.  Не может тут быть какой-то нестыковки?

8 (изменено: Pokerist, 2012-04-11 13:34:45)

Re: AHK: Reload и переменные

DEL

9

Re: AHK: Reload и переменные

Убрал все тысячи кривых строк. И нашёл причину. Если это так можно назвать.
Вот код который глючит.


;------------таймеры
SetTimer, tmr1, 100
;------------таймеры


pause  ; остановка после старта и перезагрузки


ToolTip,  --- интересный эффект ---, 300, 50, 1 ; тут собака порылась!


x_kadr:= 8 

tmr1:
 MsgBox, % x_kadr
Return 



^<::
SetTimer, tmr1, off
Reload
Return

+<::
Pause, Toggle
Return

Стоит убрать ToolTip и эффект исчезает.  С чем это связано? Как можно с этим бороться?

10 (изменено: Irbis, 2012-04-11 14:51:13)

Re: AHK: Reload и переменные

Ничего интересного нет. Какого эффекта ты ожидал, поставив таймер впереди объявления переменной?
Tooltip лишь дает задержку, которая не дает инициалазировать переменную x_kadr до первого MsgBox - 
можно проверить, что Sleep, 100 дает ровно такой же эффект, что и tooltip
Если поставить x_kadr:= 8 выше создания таймера, "загадочный" эффект пропадает.

OFF: Есть подозрение, что не только этот фрагмент сделан через... в смысле, традиционным народным индуским стилем, так что удивляться особо нечему.

11

Re: AHK: Reload и переменные

Irbis пишет:

OFF: Есть подозрение, что не только этот фрагмент сделан через... в смысле, традиционным народным индуским стилем, так что удивляться особо нечему.

Не стоит подозревть там, где уверен. (с)
Таймеры перенёс в самый верх после того как узнал, что глюки идут из-за того, что перед ними были "return".:cool:   Теперь спущу их ниже. 

12

Re: AHK: Reload и переменные

Хм. Тоже наверное плохо получится. У меня из середины кода есть несколько ссылок на самое начало объявления переменных, чьобы их все "обновить" когда надо. Теперь таймеры будут "переинициализироваться" после таких переходов. Тоже, небось глюки пойдут?

13 (изменено: Irbis, 2012-04-11 15:52:23)

Re: AHK: Reload и переменные

Эх, и охота же "костыли" изобретать, вместо того чтоб нормальный алгоритм придумать...
Вынеси, раз так надо, все начальные переменные в процедуру InitVars, к примеру, помести ее вне секции автовыполнения (в конец скрипта) и вызывай, когда нужно.
(Долго же придется покерного бота писать, если такие тривиальные моменты заводят в тупик)

14 (изменено: Pokerist, 2012-04-11 16:21:50)

Re: AHK: Reload и переменные

Покерного бота?  LOL. Чтобы его написать нужно так в покер играть, что бот уже не нужен. Поверь. В этом я понимаю больше чем в AHK.

Про эту хитрую процедуру почитаю, спасибо!

15

Re: AHK: Reload и переменные

Э... А что про нее читать?
Название я взял чисто для примера. Почитай про GoSub, если что непонятно :-)