Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> lua поставить скрипт на паузу, while true do - скрипт с циклом не ставится на паузу!
фонарик
сообщение 3.12.2023, 19:40
Сообщение #1


****

Apprentice
Сообщений: 145
Регистрация: 23.11.2011
Группа: Пользователи
Наличность: 7
Пользователь №: 14.305



Здравствуйте. Вот такой банальный вопрос: обнаружил намедни что если в скрипте луа есть цикл, то при постановке скрипта на паузу, скрипт все равно продолжает работать:
Код
--lua
while true do
  msg('ok')
end
Подскажите пожалуйста кто знает, как сделать так, чтобы если я нажал кнопочку постановки скрипта на паузу - чтобы он слушался! И прекращал вести всякую деятельность. А после снятия с паузы - продолжал. Обычные скрипты пилота так и делают.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 3.12.2023, 23:51
Сообщение #2


***********

Модератор UOPilot
Сообщений: 9.450
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27583
Пользователь №: 11.279



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

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


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
фонарик
сообщение 4.12.2023, 0:08
Сообщение #3


****

Apprentice
Сообщений: 145
Регистрация: 23.11.2011
Группа: Пользователи
Наличность: 7
Пользователь №: 14.305



Цитата(DarkMaster @ 3.12.2023, 23:51) *
врубить дебаг
А что это значит (IMG:style_emoticons/default/biggrin.gif) И почему он небезопасен? (IMG:style_emoticons/default/unsure.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 4.12.2023, 1:07
Сообщение #4


********

Master
Сообщений: 1.388
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 20717
Пользователь №: 16.156



Цитата(фонарик @ 4.12.2023, 0:08) *

А что это значит (IMG:style_emoticons/default/biggrin.gif) И почему он небезопасен? (IMG:style_emoticons/default/unsure.gif)



Если коротко - супер профессиональная фича. Включает много возможностей, но взамен делает работу очень не стабильной в ряде программ.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
фонарик
сообщение 4.12.2023, 1:13
Сообщение #5


****

Apprentice
Сообщений: 145
Регистрация: 23.11.2011
Группа: Пользователи
Наличность: 7
Пользователь №: 14.305



Цитата(Cockney @ 4.12.2023, 1:07) *
Если коротко - супер профессиональная фича. Включает много возможностей, но взамен делает работу очень не стабильной в ряде программ.
Ясно, спасибо за объяснение. Стабильная работа других программ, я думаю, гораздо приоритетнее возможности ставить луа скрипт на паузу, когда он в цикле (IMG:style_emoticons/default/rolleyes.gif) Попробую по другому решить свою задачу.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 4.12.2023, 11:24
Сообщение #6


********

Master
Сообщений: 1.388
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 20717
Пользователь №: 16.156



Ставить скрипт на паузу в цикле - норма, но нужно понимать, что используется не чистый луа, пилот докручивает поверх него свою логику, которая непонятна нам, следовательно, если пилот не дает из коробки возможности дебага, то и не факт что она будет адекватно работать вместе с ним. В целом можно погуглить как это делают в чистом луа, но это прям забивание гвоздей микроскопом для такой задачи.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 4.12.2023, 16:32
Сообщение #7


***********

Модератор UOPilot
Сообщений: 9.450
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27583
Пользователь №: 11.279



Когда-то давно гуглил ничего толкого не нашел. Мы тогда учились с кнайтом останавливать скрипт из произвольной точки (сюрприз, но это сделать в чистом луа нельзя и у нас лютый костыль), паузу тогда не реализовали, но паузу можно через https://www.lua.org/manual/5.1/manual.html#5.9 debug.debug() и debug.sethook() и, скажем, хоткеи. Со стороны пилота можно в луа пушить включение этого дебага и соответственно хука.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 4.12.2023, 17:19
Сообщение #8


********

Master
Сообщений: 1.388
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 20717
Пользователь №: 16.156



Азиаты тоже озаботились этим вопросом https://github.com/catbro666/lua-debugger#setbreakpoint
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 4.12.2023, 18:14
Сообщение #9


***********

Модератор UOPilot
Сообщений: 9.450
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27583
Пользователь №: 11.279



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


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 4.12.2023, 18:52
Сообщение #10


***********

Модератор UOPilot
Сообщений: 9.450
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27583
Пользователь №: 11.279



в zerobrane кстати отладка идет через remotedebug либу луашную. как бы это ближе к сути не было. заодно из потока выйдем - там через сеть весь процесс идет.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 4.12.2023, 18:52
Сообщение #11


********

Master
Сообщений: 1.388
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 20717
Пользователь №: 16.156



Спроси у мейнтейнера) этож опенсурс, кто как хочет, так и ... Ну а в целом это как вектор поиска, гугл не всегда кодом помогает
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 5.12.2023, 6:10
Сообщение #12


***********

Модератор UOPilot
Сообщений: 9.450
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27583
Пользователь №: 11.279



Код
local winapi
do
    -- У меня пути не стандартные, чтобы избежать свинарника.
    -- Поэтому тут есть пара "лишних" строк.
    -- Сохраняем _текущие_ пути по которым ищутся модули.
    local back = package.path
    -- Дописываю путь по которому у меня лежат модули.
    package.path = "lua_plugins\\winapi\\?.lua;"..package.path
    -- Подгружаем собственно модуль.
    -- Хз почему, но грузить нужно именно так.
    -- Просто require 'winapi' не пашет.
    winapi = require 'winapi'
    -- Подгружаем кусок отвечающий за клавиатуру
    require[[winapi.keyboard]]
    -- Возвращаем пути поиска модулей на исходные.
    package.path = back
end

local pause_hook = function()
    if winapi.GetKeyState(17) and winapi.GetKeyState(18) and winapi.GetKeyState(90) then
        repeat
            wait(1)
        until not (winapi.GetKeyState(17) and winapi.GetKeyState(18) and winapi.GetKeyState(90))

        while not (winapi.GetKeyState(17) and winapi.GetKeyState(18) and winapi.GetKeyState(90)) do
            wait(1)
        end
        repeat
            wait(1)
        until not (winapi.GetKeyState(17) and winapi.GetKeyState(18) and winapi.GetKeyState(90))
    end
end
debug.sethook (pause_hook, "l")

-- ДАЛЕЕ ВАШ СКРИПТ
while 1 do
    log(os.clock())
    wait(1)
end

Мой вариант без особых заморочек. Через дебаг луа и хуки. По поводу безопасности кода - в манах луа написано, что дебагне безопасен с точке зрения доступа к данным. Ну в том смысле, что это создает потенциальные пути для взлома. Если, скажем, взять варкрафт в котором огромный кусок написан на луа и включить там дебаг, то при желании можно получить доступ далеко не только к пользовательским функциям. Из минусов так же будет некторое падение производительности. В стандартном использовании будет не заметно, но если будет идти жесткий перебор массивов, то может быть существенно. Например, если используется findcolor на чистом луа - скорость просядет.
Данный код не совместим с моей дебаг либой (котора dbg, dbg.enable()). Если есть необходимость могу их скрестить.

Пауза на ctrl+alt+z

Получение кодов клавиш:
Код

--lua
local winapi
do
    -- У меня пути не стандартные, чтобы избежать свинарника.
    -- Поэтому тут есть пара "лишних" строк.
    -- Сохраняем _текущие_ пути по которым ищутся модули.
    local back = package.path
    -- Дописываю путь по которому у меня лежат модули.
    package.path = "lua_plugins\\winapi\\?.lua;"..package.path
    -- Подгружаем собственно модуль.
    -- Хз почему, но грузить нужно именно так.
    -- Просто require 'winapi' не пашет.
    winapi = require 'winapi'
    --ext.lg(winapi)
    -- Подгружаем кусок отвечающий за клавиатуру
    require[[winapi.keyboard]]
    -- Возвращаем пути поиска модулей на исходные.
    package.path = back

    socket = require 'socket'
end

-- Поолучаем состояние клавиши:
-- state - нажата/отжата
-- toggle - для лампочек горит/не горит.
--local state, toggle = GetKeyState(0x14)
--log(tostring(state),tostring(toggle))

local state_arr = {}


while 1 do
    for i = 0, 255 do
        local state, toggle = winapi.GetKeyState(i)
        if state and not state_arr[i] then
            state_arr[i] = true
            log(string.format("%.3f", os.clock())..": "..i.." down")
        elseif not state and state_arr[i] then
            state_arr[i] = false
            log(string.format("%.3f", os.clock())..": "..i.." up")
        end
    end
    wait(1)
end


Сообщение отредактировал DarkMaster - 5.12.2023, 6:11


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 5.12.2023, 10:07
Сообщение #13


********

Master
Сообщений: 1.388
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 20717
Пользователь №: 16.156



Имхо - это не брекпоинт (но ты вроде говорил про костыли, да ?). Нормальный брекпоинт делается на системных функциях или встроенных в вм. А тут ты по сути вешаешь поток выполнения, да еще и процессор заставляешь переключаться с этого потока на цикл.

Ну и еще момент - почему по моей ссылке много букв. Там бряк можно ставить на любую функцию и строку, а это вот реально полезно для проверки веток условий, например, когда логгировать нельзя
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 5.12.2023, 11:47
Сообщение #14


***********

Модератор UOPilot
Сообщений: 9.450
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27583
Пользователь №: 11.279



была задача сделать паузу. пауза есть.
надо полноценные брейки, отладку и т.д.? zerobrane. Нужно дебажить кусок с наличием пилотовских функций и из-за этого zerobrane не подходит? Ну так я эту проблему и не пытался решить и не собирался. Если нужно именно брейки в рамках пилота - это отдельный длинный разговор. В твоей ссылке кстати точно так же вешается хук дебаговский. Дальше код разбирать даже особо не стал ибо метод тот же и реального обхода костыльности я не вижу. Из сколько-нибудь размуных альтернатив именно паузы - морозить поток. Но тут чет у меня сердце вообще пока не лежит к таким мерам.

Сообщение отредактировал DarkMaster - 5.12.2023, 12:06


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 5.12.2023, 13:25
Сообщение #15


***********

Модератор UOPilot
Сообщений: 9.450
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27583
Пользователь №: 11.279



Кстати zerobrane может через remotedebug и пилотовские скрипты дебажить. Совсем забыл про это. Просто уже привык, если пишу что-то сложное - сразу в zerobrane, если что-то в пилоте, то обычно жестко дебажить и не нужно... Там как раз больше логирование выходит на передний план чтобы отследить всю цепочку событий.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 5.12.2023, 16:46
Сообщение #16


********

Master
Сообщений: 1.388
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 20717
Пользователь №: 16.156



Да я и не смею спорить, что по ссылке тоже костыль. Лишь указал что он куда более полезен, т.к. декларативно позволяет ставить бряки построчно. Именно такой кейс и у автора топика. Встать где-то посреди функции автоматически, без шаманства с хоткеями.


П.с. я то сам на луа не пишу, это так, рассуждения
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 5.12.2023, 17:00
Сообщение #17


***********

Модератор UOPilot
Сообщений: 9.450
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27583
Пользователь №: 11.279



Цитата
Встать где-то посреди функции автоматически, без шаманства с хоткеями.

Цитата
чтобы если я нажал кнопочку постановки скрипта на паузу - чтобы он слушался

Дык вроде как раз таки нет. Автоматически внутрь функции что-либо вкорячить вообще проблемы не вижу. Ну сделай любую пользовательскую функцию и вставляй куда хочешь. А вот к интерфейсу прикрутить чтобы, как в норм редакторе на поля тыкать - все равно не сможешь. Но хочется - вперед к remotedebug и zerobrane. Сложность как раз в том, что по велению левой пятки в случайный момент времени и выполнения встать на паузу. Например, если там куча move или kleft, а нам нужно что-то сделать на машине без остановки скрипта. Я понял задачу именно так.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 6.12.2023, 10:26
Сообщение #18


********

Master
Сообщений: 1.388
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 20717
Пользователь №: 16.156



Видимо замылились глаза - ты прав, нужно по нажатию кнопки останавливать.

Цитата
Автоматически внутрь функции что-либо вкорячить вообще проблемы не вижу. Ну сделай любую пользовательскую функцию и вставляй куда хочешь


Ну так и как в твоем варианте встать на бряк в функции на 15 строке ? И именно на ней
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 6.12.2023, 10:35
Сообщение #19


***********

Модератор UOPilot
Сообщений: 9.450
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27583
Пользователь №: 11.279



Цитата

Ну так и как в твоем варианте встать на бряк в функции на 15 строке ? И именно на ней

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

=)

Если мне надо будет в пилоте встать на 15 строке - я напишу функцию остановкии в зависимости от того, что требуется в плане остановки и вызову ее на 15 строке =) В рамках пилота большего мне не нужно. Бряк здесь почти бесполезен, т.к.стек ты автоматом не увидишь, локальные пременные тоже, степ бай степ не включишь(без доп хуков) и т.д. Чтобы все это делать недостаточно возможностей пилота, как редактора. Можно конечно эмулировать пользовательский ввод и через prompt или подкгрузку файла повыполнять произвольный код и фактически, как в консоле выдергать все, что нужно, но зачем? Для этого есть готовые инструменты с нормальным интерфейсом.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 10.12.2023, 22:50
Сообщение #20


********

Master
Сообщений: 1.388
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 20717
Пользователь №: 16.156



Ладно, ладно, убедил)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 2.3.2024, 7:04
Designed by Nickostyle