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

 
Ответить в эту темуОткрыть новую тему
> Работа с несколькими окнами одновременно
Aqualon
сообщение 11.6.2023, 22:37
Сообщение #1


**

Neophyte
Сообщений: 23
Регистрация: 21.3.2023
Группа: Пользователи
Наличность: 1
Пользователь №: 20.503
Возраст: 22



Собственно стоит задача - сделать так чтобы пилот мог одновременно посылать команды в 2 разных окна.
Погуглив немного я нашёл про coroutines, захотел проверить что это и как оно вообще работает но сходу влетел в столб. Есть вот такой код:
Код

Код

co1 = coroutine.create(
    function()
        for i = 1, 100 do
            log(i)
            coroutine.yield(co1)
        end
    end
)

co2 = coroutine.create(
    function()
        for i = 1, 100 do
            log(i)
            coroutine.yield(co2)
        end
    end
)

while true
    log(1)
    coroutine.resume(co1)
    coroutine.resume(co2)
end


Если я этот код вызываю - в логе есть только цифра 1, которая логируется в начале основного цикла, т.е. в основном цикле проходит единственная итерация.
Если я меняю log(i) на print(i) - цифра 1 логируется в логе бесконечно (т.е. основной цикл работает нормально) но никакого лога из корутин нет в принципе. Судя по всему функция в корутине валится с ошибкой, видимо контексте корутины вообще нет доступа к функциям пилота.

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

Собственно отсюда вытекает вопрос: можно ли заставить корутины работать таким образом который мне нужен (как минимум - передавать поток другой функции если в текущей функции стоит задержка), или же лучше использовать какой-то другой инструмент?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 11.6.2023, 23:17
Сообщение #2


********

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



Код
 coroutine.yield(co1)
->
Код
coroutine.yield()


а так ?

это чтобы через resume() можно было посмотреть работают корутины или нет
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aqualon
сообщение 12.6.2023, 0:09
Сообщение #3


**

Neophyte
Сообщений: 23
Регистрация: 21.3.2023
Группа: Пользователи
Наличность: 1
Пользователь №: 20.503
Возраст: 22



Поменял код
код

Код

co1 = coroutine.create(
    function()
        for i = 1, 100 do
            log('coroutine #1, iteration', i)
            coroutine.yield()
        end
    end
)

co2 = coroutine.create(
    function()
        for i = 1, 100 do
            log('coroutine #2, iteration', i)
            coroutine.yield()
        end
    end
)

while true do
    log('main loop iteration')
    coroutine.resume(co1)
    log('after 1st coroutine')
    coroutine.resume(co2)
    log('after 2nd coroutine')
end


Собственно если вызываю этот код - видно только лог main loop iteration.
Если убираю log из функции корутины - бесконечно выводит в лог по очереди все логи, вроде всё работает, но что там происходит внутри корутины вообще не понятно.
Я собственно думаю что корутины находятся за пределами понимания пилота и там нет контекста его функций, что странно, т.е. в документации по корутинам сказано что внутри корутин пусть и есть свой контекст - они должны видеть глобальные переменные.
Если залогать в основном потоке переменную в которой содержится корутина - она выведет ссылку на поток корутины согласно документации
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 12.6.2023, 17:54
Сообщение #4


********

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



Попробовал позапускать корутины. Действительно имеется какая-то проблема с вызовом функций пилота из них. Функции видны из глобальной области и их можно вызвать но происходит падение корутины. Как отлаживать не совсем ясно. Причина скорее всего именно в пилоте, а не луа.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 12.6.2023, 20:00
Сообщение #5


***********

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



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


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


***********

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



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


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


**

Neophyte
Сообщений: 23
Регистрация: 21.3.2023
Группа: Пользователи
Наличность: 1
Пользователь №: 20.503
Возраст: 22



Цитата(DarkMaster @ 12.6.2023, 21:25) *

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

Я так понимаю нужна эта библа с luapower.
А какие именно "накладные расходы" имеются в виду?
Сильная нагрузка на память будет?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 13.6.2023, 16:58
Сообщение #8


********

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



Цитата(Aqualon @ 13.6.2023, 14:28) *

Я так понимаю нужна эта библа с luapower.
А какие именно "накладные расходы" имеются в виду?
Сильная нагрузка на память будет?



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


***********

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



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


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

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

 

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