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

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


**

Neophyte
Сообщений: 23
Регистрация: 21.3.2023
Группа: Пользователи
Наличность: 0
Пользователь №: 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Отправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов
Aqualon
сообщение 12.6.2023, 0:09
Сообщение #2


**

Neophyte
Сообщений: 23
Регистрация: 21.3.2023
Группа: Пользователи
Наличность: 0
Пользователь №: 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Отправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения



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

 

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