Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

UoKit.com Форумы _ UO Pilot _ переменная ' ' is not a valid integer value

Автор: nykep 11.9.2020, 19:37

у меня один скрипт присваивает переменным значение из другого, делает это примерно раз в секунду и делает клик в в эти переменные, может работать 10 часов без проблем, а может выдавать такую ошибку каждые полчаса. Скрипт из которого берутся значения работает всегда и эти переменные описываются сразу на старте, затем findcolor ищет цвет и только при нахождении присваивает этим переменным новые значения, то есть больше они нигде не задействованы - только в "шапке" и в условии после findcolor и по идее всегда имеют определенное целое значение. Есть третий скрипт с задержкой 1 который управляет остальными и в нем при определенном условии есть команда на остановку первых двух скриптов stop_script allex, но она срабатывает довольно редко - раз в несколько часов и даже реже, то есть те два скрипта останавливаются одновременно и вроде бы второй скрипт не должен пытаться что-то считывать с первого. Прописывал кучу всяких условий перед kleft x#, #y дабы быть уверенным что в момент считывания значений из другого скрипта он находится в рабочем состоянии, написал на всякий случай kleft round(#x), round(#y), ничего не помогает. Может быть это заглюк какой то не знаю. Есть ли какой то способ избежать ошибки при выполнении move #x, #y и kleft #x, #y если переменные имеют не подходящие значения для этих команд?

Автор: cirus 12.9.2020, 1:34

Попробуйте вместо stop_script использовать pause_script.

Автор: nykep 12.9.2020, 2:02

я уже пробовал прямо перед stop_script allex писать pause_script allex, но вроде ошибка опять была и я убрал, че то я уже запарился и не помню что там у меня выскакивало, ну да ладно попробую еще раз. А нельзя написать какое то условие на проверку типа if #x <> null или что-то такое?

Автор: cirus 12.9.2020, 2:06

Цитата
перед stop_script

Вообще не использовать stop_script.

Автор: nykep 12.9.2020, 2:45

если не использовать stop_script то после resume_script те скрипты продолжат нажимать все не впопад, я однажды включил монитор а у меня скрипт, который должен быть остановлен когда персонаж зашел в город не остановился и пытается выкидывать мои вещи, просто тыкая куда попало, хорошо что там выскакивает окно с подтверждением на выброс и он не попал по кнопке подтвердить smile.gif
Кстати проверил сейчас при выключенном скрипте 0

Код

move round(#x.0), round(#y.0)

двигает в -1 -1 без каких либо ошибок и меня это вполне устраивает, но видимо дело не в этом. Если без округления то выдает ошибку '#x.0' is not a valid integer value, и теперь я припоминаю что в моей ошибке название переменной то и не упоминается просто кавычки ' ' is not a valid integer value , но указывает на строку move round(#x.0), round(#y.0) вот что странно
Вот еще что - первый скрипт периодически останавливает второй около 3 раз в минуту, может ли быть такое что второй скрипт выполняя команду move round(#x.0), round(#y.0) останавливается прямо на ней и поэтому выдает такую ошибку ?

Автор: cirus 12.9.2020, 3:37

Причина, приводящая к ошибке при использовании stop_script, не была выявлена. Гадать смысла нет. Ответ тот же - не использовать stop_script.

Цитата
если не использовать stop_script то после resume_script те скрипты продолжат нажимать все не впопад

restart_script вместо resume_script.

Автор: nykep 12.9.2020, 3:41

спасибо, попробую

Автор: nykep 12.9.2020, 4:29

возникла проблема - когда первый скрипт ставит на паузу второй в тот момент когда во втором зажата кнопка Е, то отжать ее в первом скрипте с помощью sendex не получается, да что там сендексом, даже пальцем в кнопку не отжимается

Автор: DarkMaster 19.9.2020, 5:04

1) Вам действительно нужно 2 скирпта? При использовании считывания/записи данных нужно понимать, что для корректной работы нужна синхронизация потоков. Фактически получившаяся ситуация с залипшей клавишей, как раз частный случай подобной проблемы.
2) Если уже слишком много наворочено и исправлять все в разумное русло через чур ресурсоемко, то могу предложить проверять статус клавиш после остановки скрипта через stop_script и отжимать их через вкладку вызвавшую этот stop_script.

Автор: nykep 23.9.2020, 21:55

да у меня 4 очень больших скрипта, 3 из которых работают постоянно, переделать все в один скрипт у меня не хватит ни сил ни ума, и я не уверен что это то, что мне нужно, например раньше у меня было не 4, а 3 скрипта и мне всегда не очень нравилось как они выполняют свою работу, но после разделения одного скрипта на два и небольших корректировок, время прохождения инста сократилось с 3.5 минут до 2.5, и "качество" прохождения значительно выросло, теперь он лучше зачищает и лучше собирает лут и т д. Дело в том что для меня имеет большое значение именно скорость прохождения и качество зачистки, а этого позволяет добиться одновременная проверка цветов findcolor и поиск картинок findimage в разных скриптах. Как бы там ни было я уже решил этот вопрос с помощью всяких костылей smile.gif

еще возник вопрос - можно ли как то завершить приложение по хэндлу, у меня к примеру 2 одинаковых окна и мне надо завершить лишь одно определенное из них.

Автор: DarkMaster 24.9.2020, 1:40

Через пид можно.
https://uopilot.uokit.com/wiki/index.php?title=WorkwindowPID
будет что-то вроде:

Код
set #pid WorkwindowPID
exec taskkill /PID #pid

Автор: cirus 24.9.2020, 1:49

Цитата
одновременная проверка цветов findcolor и поиск картинок findimage в разных скриптах.

Поиск происходит поочереди, что в одном скрипте, что в нескольких.
Цитата
можно ли как то завершить приложение по хэндлу

https://uopilot.uokit.com/wiki/index.php?title=SendMessage
Ещё можно используя луа вызвать EndTask.

Автор: nykep 24.9.2020, 7:30

Цитата(cirus @ 24.9.2020, 1:49) *

Поиск происходит поочереди, что в одном скрипте, что в нескольких.

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

Автор: DarkMaster 24.9.2020, 11:22

Цитата
об этом я уже слышал, просто мне нужно чтобы пока один скрипт нажимает куда то мышкой и клавишами со всеми нужным задержками, другой в это время проверял цвета и картинки, всё это делается на ходу и задержка даже в 100 миллисекунд когда он не производит поиск, приводит к тому что он пробегает мимо лута или какого-нибудь ящика, там всё происходит быстро.

у финдов очень широкие возможности по оптимизации поиска. Я бы рекомендовал уменьшить до минимально возможных размеров изображения, закрасить все несущественные/дающие погрешность пиксели в цвет левого верхнего пикселя(считается фоновым). Так же возможно сделать что-то вроде шахматного порядка внутри изображения получая приличную площадь, но проверяя каждый второй-третий пиксель(точно так же закрашивая). Подобные действия могут увеличить скорость обработки в десятки раз.

Автор: Fors1k 24.9.2020, 11:30

Цитата(nykep @ 23.9.2020, 21:55) *
завершить приложение по хэндлу

Код
// Ваш код
--lua
require"luaposh";PScode('void',{[[#}
#
ps|where mainWindowHandle -eq 14483740|kill
#
]]})
--endlua
// Ваш код
end_script

Завершит приложение по хэндлу окна 14483740.

Автор: DarkMaster 24.9.2020, 13:28

Цитата
EndTask

Это где и чего?

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

Автор: cirus 24.9.2020, 13:40

Цитата
EndTask
Это где и чего?

winapi.
Код
--lua
local ffi = require("ffi")
ffi.cdef[[ bool EndTask(int hWnd, bool fShutDown, bool fForce); ]]

ffi.C.EndTask(workwindow(), false, true)   -- закрыть рабочее окно

Автор: Fors1k 24.9.2020, 14:08

Цитата(DarkMaster @ 24.9.2020, 13:28) *

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

sendmessage?
Каких окон?

Автор: DarkMaster 24.9.2020, 15:34

Цитата
winapi.

мля) я думал очередные полускрытые фичи luajit. Типа меток. Luajit из стейбл ветки типа 5.1, а метки пашут.
Цитата
sendmessage?

Ну или postmessage в зависимости от требований.
Цитата
Каких окон?

вызов taskkill в моем варианте скорее всего вызовет появление консольки. можно убрать через vbs, но зачем этот огород когда есть готовая функция?

Автор: Fors1k 24.9.2020, 15:54

Цитата(DarkMaster @ 24.9.2020, 15:34) *

вызов taskkill в моем варианте скорее всего вызовет появление консольки.

А, это да. Но все равно taskkill по хэндлу не закроет.
Цитата(DarkMaster @ 24.9.2020, 15:34) *

Ну или postmessage в зависимости от требований.
есть готовая функция

Эта готовая функция не подойдет, так как "An application can prompt the user for confirmation"(с)MSDN.
Вот EndTask - да, сработает как надо.

Автор: DarkMaster 24.9.2020, 16:51

Цитата
А, это да. Но все равно taskkill по хэндлу не закроет.

Зато по пиду закроет а дернуть пид по хендлу не проблема - одна строчка.
Цитата
"An application can prompt the user for confirmation"

САN - может спросить. а может и не спросить. Зависит от приложения. Через таск килл без ключа /F тоже может и не хлопнуть. Это запросы типа "вы собираетесь закрыть блокнотик, хотите сохранить изменения?".

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)