Что нового

Узнаём в каком месте повисла программа

lightforever

Новичок
Сообщения
37
Репутация
2
Уже долго ищу в каком же месте в моей программе происходит зависание. Если бы я подозревал какой -то участок, то это было бы просто, но не вижу ничего подозрительного. Знаете ли какие-нибудь методы, чтобы обнаружить где зависает прога?
 

bic

Знающий
Сообщения
46
Репутация
14
Re: Зависла ли программа?

Попробуй в циклах поставить sleep(1). - это метод тыка.
Веди лог. На подозрительных участках, в функциях, в циклах ставь таймер (TimerInit) - это уже точно поймешь где зависает.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Re: Зависла ли программа?

lightforever
приведи код. и темку переименуй на что нибудь более понятное, если не сложно
 
Автор
L

lightforever

Новичок
Сообщения
37
Репутация
2
Переустановил auto it. Теперь всё выглядит по-другому:
Код:
$coord=PixelSearch(500,171,770,340,10223616)

WinActivate("Red")
If $chairs<=2 And Not @error  Then 
	MouseClick("left",$coord[0],$coord[1],1)

На что получаю в лоб:
Код:
(120) : ==> Subscript used with non-Array variable.:
MouseClick("left",$coord[0],$coord[1],1)
MouseClick("left",$coord^ ERROR
>Exit code: 1    Time: -0.170


Разве такое может быть?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
проверь @error непосредственно после псерча.
Код:
$coord=PixelSearch(500,171,770,340,10223616)
MsgBox(0, '', @error)

по всей видимости цвет ты не находишь, @error выставляется на 1. потом делаешь активной окно и @error снова выставляется в 0, соответственно входишь в цикл, но значение для $coord нету. поэтому и ошибка
 

killbond

Осваивающий
Сообщения
96
Репутация
32
Я в таких случаях делаю так: вставляю
Код:
MsgBox
в те места, которые я считаю ошибочными, если требуется проверить значение переменной в этом участке кода, то переменную втыкаю в мессагу, если это массив, то
Код:
_ArrayDisplay
и от этого кручусь, если код не хочет работать правильно или так, как хотелось бы, то участок, в котором эти проверки установили ошибку, я переделываю в код с аналогичным результатом действия и т.д.

В данном случае по этому алгоритму я бы проверил это так:
Код:
$coord=PixelSearch(500,171,770,340,10223616)

WinActivate("Red")
If $chairs<=2 And Not @error  Then 
	_ArrayDisplay($coord)
	MsgBox (0, "", $coord)
    MouseClick("left",$coord[0],$coord[1],1)


Ну а дальше ход моих мыслей уже изложил Kaster :smile:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
killbond
ты тоже будешь всегда получить @error = 0 т.к. WinActivate ставит этот макро на 0 и больше не меняет.
 
Автор
L

lightforever

Новичок
Сообщения
37
Репутация
2
killbond сказал(а):
Я в таких случаях делаю так: вставляю
Код:
MsgBox
в те места, которые я считаю ошибочными, если требуется проверить значение переменной в этом участке кода, то переменную втыкаю в мессагу, если это массив, то
Код:
_ArrayDisplay
и от этого кручусь, если код не хочет работать правильно или так, как хотелось бы, то участок, в котором эти проверки установили ошибку, я переделываю в код с аналогичным результатом действия и т.д.

В данном случае по этому алгоритму я бы проверил это так:
Код:
$coord=PixelSearch(500,171,770,340,10223616)

WinActivate("Red")
If $chairs<=2 And Not @error  Then 
	_ArrayDisplay($coord)
	MsgBox (0, "", $coord)
    MouseClick("left",$coord[0],$coord[1],1)


Ну а дальше ход моих мыслей уже изложил Kaster :smile:
Kaster всё верно сказал насчёт ошибки про @error. Я и не знал, что когда применяешь большое число команд она меняет своё значение от успеха/ неуспеха операции
Дело в том, что у меня
этот код(и многие другие) выполняется около 1 000 раз(успешно), а потом где то зависает .
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
lightforever
макрокоманды @error и @extended на то и придуманы, чтобы отслеживать правильность работы функций не возвращая лишнюю информацию в самой функции. поэтому если ты хочешь проверить как сработала функция, то проверку надо ставить сразу после ее выполнения. т.к. макро всего одна, и каждая функция меняет ее по своему.
очень полезная вещь. я вот к примеру сейчас прогаю на Python, и все самописные функции приходится перегружать возвращаемыми значениям без необходимости останавливать работы основного скрипта.
 

killbond

Осваивающий
Сообщения
96
Репутация
32
Kaster сказал(а):
killbond
ты тоже будешь всегда получить @error = 0 т.к. WinActivate ставит этот макро на 0 и больше не меняет.

Да, это так, но я проверяю вовсе и не @error, а $coord. Каким бы @error ни было, если я передам неправильные координаты, или не координаты вообще, то код не будет работать как надо, а уже поняв, таким образом, что там получается в $coord, я бы начал исправлять, и, как уже сказал, пришел бы, скорее всего, к такому же выводу.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
killbond [?]
Да, это так, но я проверяю вовсе и не @error
а зачем он тогда в твоем цикле? :smile:
Not @error всегда будет возвращать True. смысла в нем нет
 

killbond

Осваивающий
Сообщения
96
Репутация
32
а зачем он тогда в твоем цикле?

Лишь для того, чтобы установить и исправить ошибку, это универсальный алгоритм такой - если код не работает, построчно проводим отладку
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
killbond [?]
Лишь для того, чтобы установить и исправить ошибку
в данном конкретном случае,@error ни на какую ошибку не укажет, т.к. WinActivate не модифицирует дефолтное значение макро. И @error всегда будет 0 (читай False). поэтому в ней в контексте твоего кода нет никакого смысла. а перекочевала она в твой код из кода автора темы, который, как мы выяснили поставил ее туда по ошибке, т.к. думал что модификация макро псерчем будет сохранять свое значение и после WinActivate.
 

killbond

Осваивающий
Сообщения
96
Репутация
32
Код:
$coord=PixelSearch(500,171,770,340,10223616)
WinActivate("Red")
If $chairs<=2 And Not @error  Then 
    _ArrayDisplay($coord)
    MsgBox (0, "", $coord)
    MouseClick("left",$coord[0],$coord[1],1)


Да нет же :smile:
Вот, объясняю построчно:
1. $coord получает свое значение (если поиск прошел успешно, то это массив с координатами, если неудачно, то это 0)
2. Активация окна "Red"
3. Некоторое условие, 1-ую часть которого я понять не могу, т.к. код не весь, во 2-ой части условия (как наверняка думал автор) проверялось, успешно ли нашел PixelSearch точку.
4. Если поиск точки прошел успешно, то появится таблица с массивом, если неудачно, эта строчка не выполнится.
5. Если поиск прошел успешно, то мессага будет пустой, если неудачно, то в мессаге будет 0.
Именно если будет 0, то будет понятно, что поиск проходит неудачно, и нужно менять код именно в этом участке.
6. Клик...

перекочевала она в твой код из кода автора темы, который, как мы выяснили поставил ее туда по ошибке

Если бы я был автором, то на момент до решения проблемы, это бы мне позволило понять, в чем ошибка в коде (не макро).
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
killbond
Верно указывает Kaster, @error проверяется неправильно, WinActivate ставит его на 0, как впрочем и все функций которые не устанавливают код ошибки (@error).

Правильнее будет “запоминать” код ошибки в переменную, и уж потом проверять её:
Код:
$coord = PixelSearch(500,171,770,340,10223616)
$error = @error
WinActivate("Red")

If $chairs <= 2 And Not $error Then
...


а ещё лучше, проверять размерность массива:
Код:
If $chairs <= 2 And Not UBound($coord) > 1 Then
 
Автор
L

lightforever

Новичок
Сообщения
37
Репутация
2
killbond:

Понимаешь в чём дело... у меня эта часть кода выполняется успешно около 1 к раз
и столько же неуспешно(дальше есть обработки в зависимости от результата)

А главное:
эта ошибка устранена и прога опять виснет! Я без понятия где. Поставил счётчики в циклах типа
Код:
$a+=1
if a>10000 Then MessageBox(0,"","stop 1")


но бестолку. Главное это то, что весь код проги выполняется по 1 000 раз, а потом идёт зависание и непонятно где
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
lightforever [?]
эта ошибка устранена и прога опять виснет
Что имеется в виду под “виснет”? не выполняется код, или GUI не отвечает, или что то другое?
 

killbond

Осваивающий
Сообщения
96
Репутация
32
CreatoR & Kaster

Это, конечно, верно, не спорю, но представьте, что вы не знаете, в чем конкретно ошибка в этом коде? И даже того, что @error хранит статус выполнения последней команды, т.е. поставьте себя на место автора. Тогда то и будет иметь смысл отладка. Я обычно так исправляю ошибки в своих кодах.

lightforever

Как было уже отмечено, проверить размерность массива, или же так:

Код:
If $chairs <= 2 And IsArray ($coord) Then




Добавлено:
Сообщение автоматически объединено:

lightforever сказал(а):
А главное: эта ошибка устранена и прога опять виснет! Я без понятия где. Поставил счётчики в циклах типа
Код:
$a+=1
if a>10000 Then MessageBox(0,"","stop 1")
но бестолку. Главное это то, что весь код проги выполняется по 1 000 раз, а потом идёт зависание и непонятно где

А попробуй выводить не через мессагу а так:
Код:
ToolTip ($a)


Конечно, проблему не решит, но зато позволит установить точно, зависает ли программа или какие-то ошибки происходят, но выполнение продолжается, а заодно и скажет точно, если зависает, в каком проходе цикла. Если счетчик встает, значит все-таки зависает. Больше бы конечно было понятно, если был бы весь код...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
killbond [?]
попробуй выводить не через мессагу а так
Вообще то для подобных зависаний есть опция:
Код:
Opt("TrayIconDebug", 1)

которая в иконке трея выводит текущую исполняемую строку скрипта.

P.S
А ещё есть Graphical AutoIt Debugger.
 
Автор
L

lightforever

Новичок
Сообщения
37
Репутация
2
CreatoR сказал(а):
killbond [?]
попробуй выводить не через мессагу а так
Вообще то для подобных зависаний есть опция:
Код:
Opt("TrayIconDebug", 1)

которая в иконке трея выводит текущую исполняемую строку скрипта.

P.S
А ещё есть Graphical AutoIt Debugger.

Мега ценная инфа. Спасибо большое ! :smile:
 
Верх