Перейти к публикации
Форум - ComputerCraft

Таблица лидеров


Популярные публикации

Отображаются публикации с наибольшей репутацией начиная с 20.10.2018 во всех областях

  1. 7 баллов
    С переменным успехом работа продолжается: Перенес основную логику на сангаровский JNLua вместо LuaJ, добавил лимитирование оперативки Переосмыслил систему виртуализации: теперь каждая машина - это отдельное окошко со своими параметрами, сохраняемыми в конфиге Запилил опцию изменения пропорций виртуального экрана для screen.getAspectRatio(), а то эмуляторы обычно выдают 1, 1 по дефолту Реализовал компонент tunnel, который, в общем-то, ничем не отличается от модема. Возможно, если нервы не сдадут, в будущем добавлю систему энергозатрат - и тогда связанная карта будет жрать овердофигища ресурсов Сделал выбор имени игрока, от лица которого осуществляется управление компом Добавил фичу скрытия тулбара справа, чтоб ничто не отвлекало взор, так сказать Багов, конечно, жопой жуй: не всегда корректно читаются файлы в бинарном режиме, многие фичи по типу computer.addUser() являются не более чем функциями-заглушками, а еще странно читаются экранные события при вертикальной ориентации. Ну, по крайней мере, опенось уже запускается. И гляньте, какой чудный FPS:
  2. 6 баллов
    Эм, здрассьте. Предлагаю поглядеть на новое обновление мода. Очень толстого обновления. Отрегулировали частоту выполнения хука, который шлёт этот ненавистный "too long without yielding", так что теперь и скорость исполнения кода должна гораздо возрасти, и с ошибкой этой код падать реже. Мы проверяли: некая гуи-либа с 1.6 fps до 2.5 fps только благодаря этому работать стала. Оптимизировали производительность ещё и записи на диск. Пошустрее будет — обещают, что в 5–500 раз. Сетевой разделитель (сплиттер) стал компонентом. Можно программно теперь отключать куски сети. Жёсткие диски стало возможным делать Read-Only. Компьютеры CC могут читать сигналы бандлед-редстоуна OC. И наоборот. Функции [il]debug.getlocal[/il] и [il]debug.getupvalue[/il]: возвращают они лишь только имя переменной, но не значение её. И мне кажется, что это уже давно было завезено. Геолайзеры получили методы [il]isSunVisible[/il], [il]canSeeSky[/il] и [il]detect[/il]. Неплохо. В [il]computer.beep[/il] можно писать морзянку. [il]computer.beep("---.---")[/il]. [il]redstone.setOutput[/il] научился ставить значения больше 15. Клавиатуру можно цеплять к монитору, если ещё поставить к непередней стороне блока. Наконец-то. [1.12] Вернули поддержку Project Red. Через адаптер можно теперь работать с камерой реактора IC2. У серверных дисководов тоже есть теперь гуишка (пкм в мире или внутри интерфейса стойки). Торговый апгрейд обзавёлся методом [il]getMerchantId[/il]. Полезно, если жителей куча. [1.12] Вернули поддержку энергии AE2. В конце-то концов: дебаг-карте добавили [il]scanContentsAt[/il]. Больше инфы возвращается для предметов из Draconic Evolution. Вейпоинты стало можно ставить вверх или вниз. Это действительно было слишком контринтуитивным. Связанные карты можно скрафчивать вместе (повяжет на новый канал их). Плюс получать адрес канала при скане стэка. Можно теперь менять цветовой код сундуков Ender Storage. Связанные карты также научились будить компьютер по сигналу, как модемы. Белый и чёрный списки измерений для чанклоадера. Метод [il]disk_drive.media[/il], которым можно получить адрес дискеты внутри дисковода. Поддержка Forge Energy для зарядки предметов вроде батареек и планшетов. Анализатор показывать будет по клику на адаптер ещё и содержащийся в нём компонент. Событие [il]redstone_changed[/il] показывает, какой цвет поменялся на бандлед-кабеле. По шифт-клику компоненты закидываются в соответствии с их уровнями. Подрезали немного шум в логе от OC. Методы вроде [il]robot.suck[/il], [il]robot.suchFromSlot[/il] и [il]transpoer.transferItem[/il] теперь возвращают вместо [il]true[/il] число перемещённых предметов. Немного уменьшили назойливость частиц наномашинок. Жёсткий диск 3 уровня в режиме без ФС стал иметь по умолчанию не 6, а 8 пластин. Улучшили рендер кабелей как-то. Такие же "как-то" улучшения произошли с инвентарём роботов, апгрейдом крафта, методами [il]swing[/il] и [il]use[/il], взаимодействием с жидкостными баками. С модами получше работать должны. Чанклодыри можно ставить в микроконтроллер теперь. Расширили покрытие юникода шрифтом. Стандартный биос стал есть меньше памяти. Мониторы глючить должны поменьше. Пофиксили обнуление содержимого инвентарей блоков мода при крашах. Ещё некий краш при установке микроконтроллеров починили. Команду [il]/oc_nm[/il] вправили в место и заставили работать. Дюп роботов убран. Команды перемещения теперь говорят, успешно или безуспешно вызов завершился. Форсирование [il]LuaJ[/il] не форсировало эту архитектуру. [il]transferItem[/il] проверял не ту сторону. Починили Unknown error при попытке залить чего-то в некие машинки. Дюп дронов тоже починили. Выкорчевали возможную ошибку при запуске вместе с IC2. Роботы перестали потреблять ингредиенты при крафте, которые не потребляются. Апгрейд ангельский стал работать. Пофиксили торговый апгрейд. Его прямая задача исполнялась кривовато. Роботы не перемещались, когда нужно было. Дюп предметов дронами и роботами. Дискету network тоже можно ставить через install теперь. Дюп жидкостей, конечно, тоже был и тоже пофикшен. Дроны не реинициализировались после включения по сообщению модема. И вели себя очень странно. Всякие фиксы в интеграции с AE2. Опять некий дюп EEPROM. Удалён. Краши при загрузке с Applied Llamagistics. Краши при нетрадиионной установке компьютеров. Краши (но на клиенте), связанные как-то с кабелями и загрузкой чанков. [il]enableNanomachinePfx[/il] не имела эффекта. Роботы стали вызывать обработчики модов при получении опыта. Вводящие в заблуждение сообщения анализатора о выключенных компьютерах стали вводить в заблуждение в меньшей степени. Микроконтроллеры свою начинку теперь тоже выключают вместе с собою. Всякие ошибки кидал апгрейд поводка вместе с некоторыми модами. Фиксед. [1.10+] Починен рецепт крафта карточки с мировым датчиком. Экран планшетов теперь не зависает. Терминальные серверы ненормально цепляли удалённых терминалов на себя. Ошибки освещения с шейдерами. В OpenOS ещё отметить можно: Команда [il]reset[/il], которая ресетит разрешение. Ошибки сервисов пишутся в /tmp/event.log. Можно теперь ловить ошибки по Ctrl-Alt-C (жёсткие прерывания) путём переопределения функции в [il]process.info().data.signal[/il]. Копипаст в [il]edit[/il]: Ctrl-K — вырезать, Ctrl-U — вставить строку. Процессы закрывают файлы при завершении. Ссылочка на гитхаб, откуда можно скачать мод.
  3. 5 баллов
  4. 5 баллов
    Крутая игра! Немного поиграл мне очень понравилось!
  5. 4 балла
    Я поражён, если честно, выдержке, которая потребовалась для написания такого. Я бы уже на втором энде запилил строку вроде [il]"#${}<>*?$!':@+`|="[/il], а потом делал бы [il]characters:find(gpu.get(4 + i, 3))[/il]. По скриншотам выглядит неплохо. Вообще, круто, что проект до релиза доведён. Некоторые (глазами упираюсь в @LeshaInc) и такого не достигают. P. S. К слову — я, наверное, этим разочарую — но даже с таким крупным текстом, как в первых постах, без очков я не разгляжу толком что-либо, к сожалению. Укатились старания в вену.
  6. 4 балла
    Update6(27.10.2018) Это изменение касается только игры MazeMaster 1) Добавлено меню, а также куча настроек 2) Добавлена функция "поиск пути", рабочая, однако отрисовка не доделана, если в настройках включена она, то срабатывает при нажатии "P" 3) Добавлены маркеры, установить на пробел 4) Пофикшены пара багов в генераторах, в рекурсивном теперь начинает из случайной точки, а в hunt&kill больше не может быть циклов 5) Добавлена возможность изменения точки начала и конца 6) На случай если либа, нужная не скачана, то предложит пользователю скачать её при наличии инет карты
  7. 4 балла
    Пилим игру всем форумом на LÖVE. Жанр: top-down шутер в стиле Crimson Land. Сеттинг математический: считаем определители матриц 10х10, бьем врагов знаком интеграла, дифференцируем экспоненту. Предполагается наличие мультиплеера. Графон двухмерный, векторный — рисовать будет @Totoro. @Totoro предложил вести разработку по принципу Git Flow: создаем feature ветку, ревьюим, мержим в dev, затем dev мержим в master и выпускаем релиз. Репа: https://gitlab.com/cc-ru/determinant. Присоединяемся. Обсуждаем в IRC.
  8. 4 балла
    За такие слова и партбилет на стол положить можно.
  9. 2 балла
    Представляю Вашему вниманию RedOS, ОСь предназначенную для первоуровневых компьютеров. Прежде всего стоит сразу сказать, что RedOS Lite является графической оболочкой, пусть и со своим аналогом Shell и буферизацией, писать отдельно UEFI было очень сложно, к тому же смело можно было бы попрощаться с поддержкой работы с OpenOS. Совсем чуть-чуть предыстории.... Решил написать свою ОСь на Open Computers, под мощные серваки уже была MineOS, под слабые школьные ведра ничего не было, вот и начался мой тернистый путь с урезаниями и переносами.... Основной функционал: - Интуитивный графический интерфейс; - Буферизация графики; - Возможность работать с папками и файлами; - Выход в Shell в любой неудобный момент; - Собственный оператор ввода текста (Необходимость) И самое главное.... Системные требования: Минимальные (256 Кб) Рекомендуемые (512 Кб) Небольшой гайд по установке и работе: Управление курсором осуществляется стрелочками: "1" и "2" открывают меню "Система" и "Редактор" В "Системе" можно выключить компьютер, перезагрузиться, выйти в Shell. В "Редакторе" можно создать папку и файл, а также найти файл по имени в текущей папке ("Finder") Также при нажатии на "Enter" на файле или папке открывается соответствующее меню Перемещаться по папкам "вверх" можно путем нажатия клавиши "Backspace" Теперь об установке... Прежде всего папку с ОС вы можете скачать с моего GitHub Следующий шаг разместить содержимое папки "RedOS 1.0" на любой свободной дискете, заранее инициализировав ее, думаю не стоит объяснять, как сохранить файл болванку на дискету, чтобы она в Windows виделась. Ну и наконец вставить дискету в компьютер с уже установленной OpenOS, и установить содержимое. После перезапуска RedOS будет полностью в вашем распоряжении. И последнее (О нюансах)... На системах с минимальным объемом оперативной памяти могут возникнуть проблемы при редактировании файлов после прогулки по большим папкам, рекомендую перезапустить компьютер. Встроенный оператор поддерживает до 32 символов ввода, при создании папки "/" писать не следует, также есть отслеживание недопустимых символов, а также уже существующих папок и файлов, и последнее: при поиске папки следует написать "/", иначе поиск будет осуществлен только по файлам и соблюдая заглавность букв.
  10. 2 балла
  11. 2 балла
    Софтина почти готова: если глюки и встретятся, то без особого буллшита по отношению к пользователю. Список изменений: Создание машины происходит с чистой копией OpenOS и дефолтным кодом EEPROM Добавлена кнопка удаления созданной машины из конфига с сохранением контента Добавлен слайдер регулировки громкости звуков компов Реализовано изменение путей к HDD/EEPROM (не муляж даже, ага) Допилен компонент internet для загрузки всех необходимостей. Еще поддержку сокетов зафигачить - и будет конфетка Ссылочка, если кто захочет затестить: https://github.com/IgorTimofeev/OpenComputersVM/releases
  12. 2 балла
  13. 2 балла
    А потом останется только запилить эквалайзер, добавить название трека, и можно бросать геймдев и пилить канал на Youtube.
  14. 2 балла
    Добавил хроматическую аберрацию в меню.
  15. 1 балл
    Список игр: 1)Шашки 2)Камень-Ножницы-Бумага 3)Тетрис 4)Крестики-Нолики(любое поле, любая линия) 5)Сапёр 6)Пятнашки 7)mazeMaster(хз как назвать, тут короче лабиринты нужно проходить) 8)SameGame TODO CLEAN UP Следующий текст является пока что бредом, надеюсь скоро исправлю Так же я делал покер, там осталось исправить некоторые ошибки и будет готов, но руки никак не дотягиваются. Инструкция к играм: 1)в играх на 2х в начале появляется 2 серые рамки на которые нужно кликнуть чтобы определить кто игрок 1, а кто игрок 2. 2)в шашках если тебе нужно побить не выделяются остальные и поэтому может казаться что игра зависла(возможно потом исправлю) 3)в играх кроме КНБ при нажатии на клавиатуру игра автоматом выходит, так что будьте осторожны 4)в некоторых играх на первых строчках находится раздел Настроек, где можно устанавливать правила Планы: Update1(03.11.2016) Update2(04.11.2016) Update3(05.11.2016) Update4(06.11.2016) Update5(17.07.2018) Update6(27.10.2018) Update7(11.11.2018)
  16. 1 балл
    Раньше выкладывал код без нормальной объяснений скринов и тд (но скринов всеравно не будет но будет видео снизу) Щас решил переделать код и упростить запуск (программа ещо в разработке если вы хотите помочь пишите в телеграм https://t.me/lfreew1ndl) Программа в будуйщем будет крафтить вещи, с возможностью подключения механизмов. (но эт пока в мечтах) Сейчас программа просто хранилище вещей на сундуках подключенных транспоузерами и выводом на экран вещей и их количества. Что б установить програмку себе вам нужно ввести команду wget -q https://gitlab.com/lfreew1ndl/openCraftNet/raw/master/openCraftNet.lua openCraftNet.lua sources https://gitlab.com/lfreew1ndl/openCraftNet/tree/master/ ну и перед етим построить комп как на видео )) на видео ниже также будет продемонстрирован реализованый функционал программки. в ет темке и буду дописивать upd если будет) (добавил аву и могу уже редачить темки)
  17. 1 балл
  18. 1 балл
    Я даже не знал что там музыка будет ет я просто слушал)
  19. 1 балл
    Музыка к месту. Нет.
  20. 1 балл
    Итак, более предметное обсуждение переносим в эту тему: Разработка игры Determinant. Задачки по разработке (легкие и сложные) будут тут: https://gitlab.com/cc-ru/determinant/issues Каждая задача имеет приблизительный уровень сложности (weight) по десятибальной шкале. Если вам кажется что он не соответствует реальности - тоже пишите, поправим. Если какая-та задача вас зацепила и есть желание попробовать свои силы - пишите в комменты к задаче, я (или кто-нибудь еще из мейнтейнеров) поставит ее на вас и поможет создать ветку. Либо, если вы не знакомы с Git - просто скачайте свежие исходники игры из ветки dev (https://gitlab.com/cc-ru/determinant/-/archive/dev/determinant-dev.zip) и добавьте свой код. Затем запакуйте игру с изменениями в архив и скиньте мне или другому разработчику игры. Мы уже подровняем и зальем в Git.
  21. 1 балл
    Итак, суммирую что сделано на текущий момент. Название: Determinant Описание: 2D мультиплеерный шутер, с видом сверху, с механикой игры в стиле Crimson Land. Стек: Lua, Love2D Репозиторий: https://gitlab.com/cc-ru/determinant Скрин логотипа и текущего состояния проекта: Разработка игры пойдет по Git Flow: основная ветка - master, в ней находится код последней рабочей версии, ветка разработки - dev, в ней идет текущая работа, новые фичи сливаются именно сюда, ветки для отдельных фич - feature-xxx, это ветки в которых будут работать отдельные участники проекта над отдельными фичами. По завершению фичи, делается код ревью кем-то опытным, потом ветка сливается в dev. Когда в dev накопится достаточное количество фич для выпуска новой версии - dev сливается в master и маркируется новым номером версии. Номера версий - по semver. То есть имеют вид <мажорная версия>.<минорная версия>.<патч-версия>. Стартуем с 0.1.0. Все, кто желает принять участие в написании проекта, или изложить свои идеи - пишите сюда, добавляйтесь в группу на GitLab, создавайте реквесты, issue и т.п. Можете заходить для обсуждения в IRC, сегодня у нас там есть даже 1Ridav.
  22. 1 балл
    Моё скромное мнение (тезисно): Большая команда с суммарным уровнем программирования ниже среднего; Явно не все будут увлечены идеей и рано или поздно сольются; Нужно сделать Totoro направляющим, так как у него есть способность писать issue на каждый чих, что в нашем случае является сильным преимуществом; На качественное тестирование надеяться глупо; Нужно выбрать статически типизированный язык, так как количетсво багов в коде завист экспоненциально от количесва людей в команде. Ошибки по типу `AttributeError: 'Class' object has no attribute 'field' ` будут неизбежно. Без должного тестирования их сложно отлавливать; Нужно выбирать игру с простой мехникой; Нужно выбирать игру с упором на разнообразие простых фич, так как в команде много человек, которым хочется чего-нибудь простого поделать; 2d графон, так как очень сложно нарисовать 3d картинку, которая не будет резать глаз человеку из 2018 года; Нужно выбирать пиксельный стиль, так как даже если сольётся норм художник, его почти каждый сможет заменить; Механики игры приоритетнее сюжета; Механики игры приоритетнее графония; Мультиплеер следует прикручивать в самом конце, если он вообще нужен; Как было замечено игра с изометрией или с видом сверху лучше, так как взаимодействие объектов с миром примитивное; Рогалик (данжи) и спейс-шутер удовлетворяют критериям выше; Движок для этих игр можно написать самостоятельно, так как кроме проверки пересечения кругов и прямоугольников ничего нет; Игры The Binding of Isaac, Enter the Gungeon, аркадный спейс-шутер, R-Type и тп. Также если команда самоуверенная, то можно попробовать что-то по типу с Castle Crashers®
  23. 1 балл
    А что предлагаешь ты? Переквалифицироваться в серьёзный ресурс для бородатых мужиков, или же окуклиться в Майнкрафте? Программирование внутри игры – это просто и весело. Порог вхождения низкий, а результаты труда наглядны. Приятно видеть, как десяток строк кода оживляют робота, заставляя его делать полезную (в игровом смысле) работу. Прокачавшие навык ищут задачи посложнее. До сих пор кто-то находит в Майнкрафте новые задачи, а кто-то находит новые решения старых задач. Кто-то ушёл в другие игры, а кто-то хочет написать свою игру. Почему нет? Сам я пока отношусь к тем, как выразился NEO, которые до сих пор не наигрались в Майнкрафт. Ну, да, бывает, я экспериментирую с другими играми, но Майнкрафт, как поставщик игровых задач для роботов, до сих пор лучший, как по мне. Тем не менее, на этом форуме я одобряю любые начинания, связанные с игровым программированием. Сейчас критика в этой теме не имеет смысла. Подождём годик, а потом уже и покритикуем. Сейчас надо накидать будущим авторам каких-то идей, которые их заинтересуют. А заинтересует ли результат игроков, предугадать сложно. Нотч, помнится, тоже не ожидал такого успеха Майнкрафта. Не исключаю даже, что ему кто-то так же предлагал заняться чем-то более осмысленным. Если находятся желающие запрограммировать игру, в которой требуется программировать, то зачем их отговаривать? Пусть пишут. Форуму это точно не повредит.
  24. 1 балл
    Искривление топографических линий пространства возле массы, влияет на движение других тел(или волн), которые перемещаются в этой среде. Но никак не влияет на перемещение самой этой массы. Линия, по которой двигается масса, испытывает искривление по оси движения, поэтому линия - не меняет своей геометрии( прямая, как была прямой - так ею и будет). Почему гироскопы сохраняют ось вращения в трёхмерном пространстве ? Да потому что : во-первых - искривление слишком мало(даже для таких тел, как планеты), во-вторых - геометрия искривления пространства массой вращающихся тел, симметрична(по крайней мере по оси вращения). Думаю этих пояснений( и немного пространственной фантазии) - будет достаточно.
  25. 1 балл
    Потоки — очень полезные штуки, позволяющие исполнять несколько кусков кода. Раньше для их использования приходилось скачивать отдельную библиотеку, работающую через костыли. Начиная с OpenOS 1.6.4, они есть в стандартной поставке ОС — в модуле thread. Давайте посмотрим, из чего она состоит — и в чём её преимущество перед любыми другим библиотеками. Начнём с версий. OpenOS 1.6.4 — версия, включённая в OpenComputers 1.7.0. Если не хотите возиться с обновлением системы вручную, требуется иметь версию выше или равную 1.7.0. Сразу обращаю внимание на самую важную вещь: потоки не могут исполняться одновременно. В один момент времени только один поток может работать. В чём тогда красота тредов? Они автономны, то есть: Начинают исполнение сразу же после создания. Передают исполнение в другие потоки в местах, указанных использователем, — при том или ином вызове computer.pullSignal (os.sleep, event.pull и т. д.). Автоматически продолжают своё исполнение без необходимости самостоятельно их стартовать. Потоки можно убить и приостановить. Они неблокирующие: Вызов computer.pullSignal не блокирует исполнение других потоков. Они отцепляемые: Процесс, в котором был создан поток, называется родительским. При завершении родительского процесса все потоки останавливаются. Поток может отсоединиться от родительского процесса и работать полностью автономно — например, как слушатели событий. Поток может сменить родителя на другого. Поток сам является процессом и потому может создавать дочерние потоки. Работающий поток не даёт завершиться своему родителю. Они независимы при обработке событий: Потоки не наследуют и не передают дочерним свой набор слушателей событий. Все слушатели событий и таймеры принадлежат только конкретному потоку. Как следствие, поток не может изменять их набор в другом. Слушатели и таймеры автоматически удаляются при завершении потока, даже если завершение вызвано ошибкой. Приостановленные потоки игнорирует события. Если несколько потоков вызвали event.pull на одно и то же событие, они оба его получат. Этот набор фич в таком объёме присутствует только в этой библиотеке, и ни одна другая и не даёт столько простоты в работе с ними. Пожалуй, приступим к использованию. Потоки создаются функцией thread.create: первым аргументом передаётся функция, дальше идут аргументы к ней. local thread = require("thread")local t = thread.create(function(a, b) print("В потоке получены аргументы:", a, b)end, 21, 42) Функция возвращает объект потока. Его же может получить сам поток вызовом thread.current() — однако если вызвана не в потоке, то возвращает nil. На всякий случай, основной процесс не является потоком. Объект потока позволяет чудить различные вещи с потоком. t:suspend() приостанавливает поток. Как уже сказано, такой поток не будет получать события и обрабатывать тики таймера. Забавно, что если приостановить поток, когда он ждёт события, то неизвестно, что он получит после его возобновления. t:resume() возобновляет работу ранее приостановленного потока. Так как созданные потоки сразу начинают работу, то обычно этот метод вызывать не придётся. t:kill() убивает поток, то есть завершает его, удаляя всех слушателей и таймеры. Возобновить работу потока после того, как он убит, нельзя. t:status() возвращает строку со статусом потока: "running" — поток работает или блокирован другим. Такой поток не даёт завершиться своему родителю. "suspended" — поток приостановлен. Его дочерние потоки также будут приостановлены. Когда родительский процесс завершается, такой поток автоматически убивается. "dead" — поток мёртв. t:attach() позволяет сменить родителя у потока. Без аргумента поток будет присоединён к текущему процессу. Переданное как аргумент число позволяет указать, к кому присоединить: 0 — текущий процесс, 1 — родитель текущего и т. д. t:detach() отцепляет поток от родителя. Такой поток будет работать до его остановки или перезагрузки компьютера. t:join() останавливает процесс, в котором была вызвана это функция, до завершения потока t. local thread = require("thread")local t = thread.create(function() os.sleep(10)end)t:join() -- остановится на 10 секунд Можно передать первым аргументом этой функции число, которое будет служит таймаутом (в секундах). Тогда, если не успеет завершиться поток за это время, join завершится досрочно. t:join ждёт только одного потока. Для групп потоков есть функции thread.waitForAny и thread.waitForAll — обратите внимание, что это функции библиотеки, а не методы объекта потока. Обе функции первым аргументом требуют таблицу с потоками, а вторым опционально можно задать таймаут. thread.waitForAll ждёт, пока завершатся все потоки из списка. local thread = require("thread")local t1 = thread.create(function() os.sleep(10)end)local t2 = thread.create(function() os.sleep(15)end)thread.waitForAll({t1, t2})print("Это сообщение будет написано через 15 секунд") thread.waitForAny ждёт, пока завершится хотя бы один поток из списка. local thread = require("thread")local t1 = thread.create(function() os.sleep(10)end)local t2 = thread.create(function() os.sleep(15)end)thread.waitForAny({t1, t2})print("Это сообщение будет написано через 10 секунд") Что будет, если поток бросает ошибку? При ошибке в потоке она не будет проброшена в родительский процесс. Как и со слушателями, она будет записана в файл /tmp/event.log, но родитель не сможет узнать причину ошибки — и, вообще, успешно ли завершился поток. local thread = require("thread")local t = thread.create(function() os.sleep(3) error("test")end)print(t:status())--> runningt:join()print(t:status())--> dead Кроме того, событие жёстокого прерывания (Ctrl+Alt+C) не передаётся всем процессам — только одному; причём неизвестно, какому именно: родителю или одному из его потоков. Если вы используете потоки, первым делом сделайте один, который будет ждать события interrupted и подчищать ресурсы. local thread = require("thread")local cleanupThread = thread.create(function() event.pull("interrupted") print("Принял ^C, чищу всякие ресурсы")end)local mainThread = thread.create(function() while true do local input = io.read() if input == "exit" then break end endend)thread.waitForAny({cleanupThread, mainThread})os.exit(0) Обратите внимание, что в конце программы стоит os.exit. Где-то я уже упоминал не раз, что родительский процесс, достигнув конца программы, не завершится до тех пор, пока работает хотя бы один из его дочерних потоков. Вызов os.exit() позволяет выйти из программы, закрыв все дочерние потоки. Что, безусловно, достаточно удобно. Есть ещё один момент. Допустим, данная программа запускается в роботе: local robot = require("robot")local thread = require("thread")local moveThread = thread.create(function() while true do robot.forward() endend)local inputThread = thread.create(function() while true do local input = io.read() if input == "exit" then break end endend)thread.waitForAny({inputThread, moveThread})os.exit(0) Если вы запустите эту программу, то должны заметить, что вы ничего не сможете написать в роботе, хотя работает io.read. Дело в том, что функция robot.forward вызывает метод компонента, который блокирует исполнение компьютера. Пока робот двигается, на компьютере не может выполняться ни одна команда. Чтобы хоть что-то можно было вставить в строку, то поставьте после robot.forward какой-нибудь os.sleep(0) — он позволит соседнему потоку принять и обработать события. Тем не менее, строка ввода всё равно будет работать с тормозами. В подобном случае задумайтесь над тем, чтобы использовать вместо строки ввода иное средство коммуникации: редстоун, сеть, интернет-сокет. Несмотря на всё, библиотека действительно облегчает работу с потоками в OpenOS. Кроме того, очень удобно поместить все слушатели событий в один поток, чтобы они все автоматически были удалены после убийства потока. local event = require("event")local thread = require("thread")local mainThread = thread.create(function() event.listen("key_down", function(evt, addr, key, code, user) print("A key has been pressed!") end) while true do print("do something") os.sleep(0.5) endend)-- событие interrupted не ловится обработчикамиlocal intThread = thread.create(function() event.pull("interrupted")end)thread.waitForAny({mainThread, intThread})os.exit(0) Не нужно функции сохранять в переменные и помнить, что нужно ставить event.ignore в конце программы; не требуется ребутать компьютер, если программа завершилась с ошибкой, а до отключения слушателей дело не дошло. В общем, красота.
Таблица лидеров находится в часовом поясе Москва/GMT+03:00
  • Рассылка

    Хотите узнавать о наших последних новостях и информации?

    Подписаться
×