Что нового

[Автоматизация] Разные задачи при выполнении одной функции

be4hoctb

Новичок
Сообщения
38
Репутация
0
Допустим есть функция в которой кликаем мышкой по позиции №1 и функция завершается, а при повторном обращении к этой функции нужно уже сделать клик мышкой по позиции №2 и так далее. Это возможно сделать?
 
Автор
B

be4hoctb

Новичок
Сообщения
38
Репутация
0
Вот для наглядности скриншот в котором список рынков, при торговле на одном рынке цена падает и необходимо переключать на другой по списку рынок и каждый раз координаты клика будут новыми.
H127luzlIxY.jpg
https://pp.vk.me/c623323/v623323243/e2bc/H127luzlIxY.jpg
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
be4hoctb,
Судя по картинке, у Вас должна меняться только Y-координата клика. Если кол-во рынков всегда одинаково (17), то можно сделать примерно так.
Код:
HotKeySet('{Esc}', '_Exit')
AdlibRegister('_MyClick', 1000)

While Sleep(100)
WEnd

Func _MyClick()
	Local Static $i__Count = 0
	Local $i_X = 250, $i_Y = 150, $i_OffSet = 25, $i_Max = 16

;~ 	MouseClick('primary', $i_X, $i_Y + $i_OffSet * $i__Count, 1, 0)
	ConsoleWrite('$i_Y + $i_OffSet * $i__Count = ' & $i_Y + $i_OffSet * $i__Count & @LF)
	$i__Count += 1
	If $i__Count = $i_Max Then $i__Count = 0
EndFunc   ;==>_MyClick

Func _Exit()
	Exit
EndFunc   ;==>_Exit
Функция будет кликать каждый раз по следующему рынку при условии, что $i_Y и $i_OffSet правильно указаны.
 
Автор
B

be4hoctb

Новичок
Сообщения
38
Репутация
0
Да вы верно все поняли, но у меня к вашему примеру почвился вопрос. Для чего нужно регестрировать функцию. Для чего эта часть кода:
Код:
AdlibRegister('_MyClick', 1000)

While Sleep(100)
WEnd
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Код:
While Sleep(100)
WEnd


Прикольно)
Я б никогда до такого не додумался.
В справке нигде не написано что Sleep что-то возвращает...

 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
OffTopic:
C2H5OH [?]
В справке нигде не написано
Написано. Здесь
[box title=TitleBox]Даже если в документации указано, что функция не возвращает значение, AutoIt всё равно возвращает значение (чтобы избежать ошибок). Чаще всего возвращается значение 1, но вы не должны на него ориентироваться.[/box]
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
C2H5OH,
Я эту конструкцию сам на форуме увидел как-то, тоже понравилось. :smile:
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Ага, ага, нашел уже)

When the documentation states that the return value = none, AutoIt always returns a value to avoid errors. 1 is usually the value returned, but you should not depend on this return value.

InnI,
я ж обычно стал на слово в SciTE и нажал F1.
А это описание в другом месте находится.
 
Автор
B

be4hoctb

Новичок
Сообщения
38
Репутация
0
Скажите, а чем это
Код:
AdlibRegister('_MyClick', 1000)

While Sleep(100)
WEnd


Отличается от этого
Код:
While 1
_MyClick
Sleep(100)
WEnd
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
В первом функция _MyClick вызывается раз в секунду, а во втором 10 раз в секунду.
Но это не главное.

Если функция _MyClick выполняется, например, 2 секунды,
то во втором случае функция _MyClick будет вызвана повторно через 2,1 секунды,
а в первом случае функция _MyClick будет вызвана повторно через 1 секунду, не дожидаясь завершения первого вызова.




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

Вот позапускай оба варианта с такой вот функцией
Код:
Func _MyClick()
    Consolewrite("старт _MyClick"&@CRLF)
    Sleep(2000)
    Consolewrite("завершение _MyClick"&@CRLF)
EndFunc   ;==>_MyClick
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Да, пример ничего не подтверждает. Потому что я всё перепутал. :-[ Это HotKey вызывает прерывание выполнения даже самой себя, а при использовании AdlibRegister просто взводится флаг необходимости выполнения указанной функции.
Вот в этом примере функция _MyClick, зарегистрированная через AdlibRegister, продолжает выполняться снова и снова, потому что время работы функции больше чем таймер в AdlibRegister.
Код:
Global $tick = 0

HotKeySet('{Esc}', '_Exit')
AdlibRegister('_MyClick', 2000)

Sleep(10000)

AdlibUnRegister('_MyClick')
Consolewrite("дошел до кондиции "&@MIN&":"&@SEC&@CRLF)

While Sleep(1000)
WEnd

Func _MyClick()
	$tick += 1
	Local $ttt = $tick
    Consolewrite($ttt&" старт _MyClick "&@MIN&":"&@SEC&@CRLF)
	If $ttt < 10 Then Sleep(5000)
	Consolewrite($ttt&" завершение _MyClick "&@MIN&":"&@SEC&@CRLF)
EndFunc   ;==>_MyClick

Func _Exit()
    Exit
EndFunc   ;==>_Exit
То есть к моменту завершения функции _MyClick, отметка о необходимости её выполнения оказывается снова установленной. И если убрать проверку условия If $ttt < 10, то выполнение скрипта никогда не завершится.
С другой стороны за время выполнения функции _MyClick таймер успевает тикнуть два раза, но очередь не накапливается. 10-ый вызов _MyClick будет последним.
Вот как-то так.
 
Верх