Версия для печати темы
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 те скрипты продолжат нажимать все не впопад, я однажды включил монитор а у меня скрипт, который должен быть остановлен когда персонаж зашел в город не остановился и пытается выкидывать мои вещи, просто тыкая куда попало, хорошо что там выскакивает окно с подтверждением на выброс и он не попал по кнопке подтвердить
Кстати проверил сейчас при выключенном скрипте 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 в разных скриптах. Как бы там ни было я уже решил этот вопрос с помощью всяких костылей
еще возник вопрос - можно ли как то завершить приложение по хэндлу, у меня к примеру 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)