Поиск по сайту
Результаты поиска по тегам 'coroutine'.
Найдено 3 результата
-
Я готовлю большой проект - виртуальную машину OpenComputers для OpenOS, и уже достиг некоторых успехов. Но появилась серьёзная проблема: Запустив MineOS своей виртуальной машиной и открыв там приложение palette, после пика любого цвета возникает ошибка Заранее извиняюсь за скриншот ошибки, но отлов и сохранение её в текстовом виде занял бы много времени. Ошибка возникает когда что-то пытается открыть файл /home/VirtualMachine1/mineos/lib/process.lua В том месте, где это происходит, - в функции filesystem.lines апи MineOS, я дампнул стек вызовов. Вот он: stack traceback: /Libraries/Filesystem.lua:572: in field 'lines' /Libraries/System.lua:2174: in field 'error' /OS.lua:231: in main chunk [C]: in function 'xpcall' machine:799: in global 'xpcall' virtual_bios:179: in upvalue 'executeString' virtual_bios:219: in upvalue 'boot' virtual_bios:473: in local 'tryBootFromAny' virtual_bios:485: in main chunk [C]: in function 'xpcall' machine:799: in global 'xpcall' /usr/lib/libvm.lua:110: in method 'start' /usr/bin/vm.lua:40: in main chunk (...tail calls...) [C]: in function 'xpcall' machine:799: in global 'xpcall' /lib/process.lua:63: in function </lib/process.lua:59> Из него становится ясно, что инициатором сего действия является библиотека OpenOS - /lib/process.lua. Тут надо немного объяснить, как вообще работает файловая система в моей виртуальной машине: Фактически, она полностью имитирует компонент файловой системы, но ограничивает её до конкретной директории. Простыми словами, open ("/test.txt") превращается в open ("/home/VirtualMachine1/mineos/test.txt"). То же самое происходит и здесь: система пытается открыть файл "/lib/process.lua", который действительно существует, но виртуальный компонент превращает его в "/home/VirtualMachine1/mineos/lib/process.lua". Кажется, всё и так понятно. Но с чего майноси вообще открывать системный файл OpenOS? Тут в дело вступает трейсбек, который говорит, что нечто происходит в 63 строке модуля process. Вот ссылка на эту самую строку в гитхабе. Здесь используется coroutine.create, которая, видимо, исполняет переданную ей функцию при пике цвета в палитре MineOS. Это всё, что мне удалось выяснить, и я понятия не имею, что с этим делать. Корутины и как они работают я знаю меньше всего из lua и opencomputers, так что буду очень рад помощи.
-
Ответ.
-
Данная библиотека позволяет "проскочить" несколько подпрограмм при вызове coroutine.yield (и coroutine.resume в эту же подпрограмму). Пример: Скачать