Перейти к содержимому

Поиск по сайту

Результаты поиска по тегам 'OpenOS'.

  • Поиск по тегам

    Введите теги через запятую.
  • Поиск по автору

Тип публикаций


Блоги

  • Робот Байт
  • Fingercomp's Playground
  • 1Ridav' - блог
  • Totoro Cookies
  • Блог cyber01
  • IncluderWorld
  • KelLiN' - блог
  • Крутой блог
  • eutomatic blog
  • Programist135 Soft
  • Сайт в сети OpenNet
  • PieLand
  • Очумелые ручки
  • Блог недоблоггера
  • В мире Майнкрафт
  • LaineBlog
  • Квантовый блог
  • Блог qwertyMAN'а
  • some blog name
  • Дача Игоря
  • Путешествия Xytabich'а
  • Рецепты программирования
  • Шкодим по крупному
  • 123
  • mineOS и её удивительный мир
  • Поляна говнокода Bumer 32

Форумы

  • Программирование
    • Программы
    • База знаний
    • Разработчикам
    • Вопросы
  • Игровой раздел
    • Игровые серверы
    • Моды и плагины
    • Жалобы
    • Ивенты и конкурсы
    • Файлы
  • Общение
    • Задать вопрос
    • Обратная связь
    • Беседка
    • Шкатулка
  • Технический раздел
    • Корзина

Группы продуктов

Нет результатов для отображения.


Искать результаты в...

Искать результаты, которые...


Дата создания

  • Начать

    Конец


Последнее обновление

  • Начать

    Конец


Фильтр по количеству...

Зарегистрирован

  • Начать

    Конец


Группа


AIM


MSN


Сайт


ICQ


Yahoo


Jabber


Skype


ВКонтакте


Gtalk


Facebook


Twitter


Город


Интересы

Найдено 20 результатов

  1. У меня давно была идея реализовать на опенкомпах клиент для какого-нибудь протокола, позволяющего подключиться к полноценному удалённому шеллу. В голову сразу приходит SSH, но я даже не стал разбираться, как он работает, ведь, он, наверное, работает очень сложно. Поэтому мой взгляд пал на древний протокол - telnet, впервые разработанный аж в 1969 году. Сейчас его практически никто не использует, ведь все данные, включая логины и пароли, он передаёт в незашифрованном текстовом виде. Хотя и существуют расширения протокола, реализующие шифрование, мой клиент их не поддерживает. Репозиторий программы можно найти тут. Установить можно в OpenOS с помощью команды wget -f https://raw.githubusercontent.com/Smok1e/oc-openos-telnet/master/installer.lua /tmp/installer.lua && /tmp/installer.lua Синтаксис очень простой, достаточно ввести telnet <адрес> [<порт>]. По умолчанию используется порт 23. Учтите, что если вы подключаетесь к серверу по локальной сети, в конфиге мода необходимо поменять "deny private" на "allow private" в 675 строке (ну или где-то рядом). В данный момент единственная проблема - escape последовательности. OpenOS обрабатывает некоторые из них сама, но далеко не все, из-за чего можно наблюдать различные текстовые артефакты в более-менее графонистых программах.
  2. Решил значит я сделать мод для OpenOS, да не обычный, а такой что бы пользователь мог его сам собрать. Что то вроде Arch Linux: можешь поставить только базу командой pacstrap -K /mnt base linux linux-firmware А можешь сразу и DE накатить да и пару приколов заодно: pacstrap -K /mnt base linux linux-firmware neofetch nano gcc make xfce4 ... Итак, к чему я. Какие пункты OpenOS вы бы хотели модифицировать? И каким образом? Текущий список идей: Замена цветовой темы (openos-mod colorscheme [FG] [BG]) [ГОТОВО] Свой менеджер пакетов поддерживающий oppm и hpm (pacman) Замена загрузчика /init.lua (Полный вывод действий, вывод только стадий, анимация загрузки, ... - openos-mod bootloader [путь/к/пакету/загрузчика.bld]) Ссылка на репозиторий: https://github.com/Def-Try/OpenArch/tree/main Буду очень рад вашему вкладу в проект
  3. Итак, я решил написать свою оболочку для OpenOS, но мне показалось неудобным прямая рисовка и обработка ивентов. Поэтому я написал что-то на подобии XServer-а из Linux(ну, вообще, там от линуксоидной версии только название и идея) Он предоставляет возможность создать две функции, которые будут управлять всем - loop, draw и handle Функции: loop(string; eventName) -> bool: skiprender вызывается *перед* отрисовкой. должен вернуть одно bool значение - true отменит отрисовку и сразу перескочит к обработке ивента, draw() -> nil вызывается для отрисовки экрана. handle(eventName, eventArguments...) -. string: action вызыватся после отрисовки, для обработки ивента. должен вернуть одну строку - действие. которое должен выполнить "икс-сервер"(см. Действия X сервера). Действия X сервера: exit - завершить X сервер и вернуться в консоль draw - повторить отрисовку экрана next - сразу же получить следующий ивент Использованные материалы: MineOS Screen API MineOS Color Library MineOS Image Library MineOS OCIF Image Format Гитхаб: https://github.com/Def-Try/X2-Server
  4. Я готовлю большой проект - виртуальную машину 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, так что буду очень рад помощи.
  5. Иногда удобно использовать встроенное средство редактирования файлов OpenOS. Однако мне никогда не нравился дефолтный чёрный цвет фона. Поэтому я немного модифицировал edit.lua так, чтобы цвета легко настраивались. Установка проще, чем заварить чай. Достаточно скопировать и запустить следующую команду (OpenOS должна быть установлена). wget -f https://raw.githubusercontent.com/Smok1e/oc-openos-colored-edit/main/edit.lua /bin/edit.lua Настроить цвета можно в стандартном файле конфигурации - /etc/edit.cfg В конце файла добавьте (или измените) следующее: colors = { background = [желаемый цвет фона], foreground = [желаемый цвет текста] } Например: Спасибо за внимание. Кстати если кто-нибудь знает, каким образом можно изменить цвета стандартной оболочки OpenOS, буду признателен, если расскажете.
  6. ProgramCrafter

    Полу-Docker

    Ваша программа требует особую версию какой-нибудь библиотеки и мешается другим программам в системе? Опасаетесь, что необходимые библиотеки потеряются в истории? Надо разворачивать одно и то же окружение на много опенкомпов?* Представляю вашему вниманию программу, позволяющая собрать программу и все её библиотеки в один файл! wget -fq https://raw.githubusercontent.com/ProgramCrafter/lua-utils/main/half-docker/enum-files.lua Программа, сохраняющая "образ" файловой системы компьютера, на котором запущена. Чтобы не сохранять образ всей OpenOS, сохраняется только разность между корневой папкой и дискетой с чистой OpenOS. Путь к этой дискете необходимо прописать на строке 6. Образ сохраняется по пути /home/archive.bin. wget -fq https://raw.githubusercontent.com/ProgramCrafter/lua-utils/main/half-docker/unpack-files.lua Программа, распаковывающая образ поверх файловой системы. Осторожно, не открывайте зловредные архивы, потому что они могут затереть даже EEPROM (указав путь для распаковки /dev/eeprom)! wget -fq https://raw.githubusercontent.com/ProgramCrafter/lua-utils/main/half-docker/container.lua Сам полу-докер - скрипт, позволяющий запустить программу с подменой её файловой системы на образ. Так как OpenOS не записывается в образ, этой программе тоже необходимо указать путь к дискете с чистой OpenOS. Подменяется только io.open - to be fixed soon, потому что из-за этого могут грузиться неправильные версии библиотек. Образ является read-only - неясно, каким образом фиксить это. *Kubernetes (для управления множеством контейнеров) в комплект поставки не входит.
  7. Я скорее всего чисто для себя, и тренировки, пытаюсь сделать что-то типа MineOs. Так вот, возможно я сильно тупой, и ошибка очень проста. Но: У меня есть установщик, в нём я указываю логин и пароль. Потом как видно, Пытаюсь записать их в переменные.. И затем происходит перезагрузка, с измененным boot.lua. Который одкрывает мой "ОС". Собственно там должен отобразится логин, и нужно ввести правельный пароль. Только пароль не распознается. И вместо логина "Label" Естетственно загрузить данные я пытаю так: Наверное это должно быть возможно, тк существует MineOs. Может как-нибудь делать запись этих данных в файл? (Измененно, нашёл команды) file = io.open file:write("") file:read() Попробую с ними (Извените за возможные ошибки, и наверое, тупой вопрос )
  8. Если вы когда нибудь сталкивались с созданием серверов под OpenOS, вам знакома проблема блокирования всего компьютера. Его нельзя использовать, пока сервер не выключится. Некоторые придумывали свои велосипеды, которые запускали event.listen или event.ignore. Но не то это! Для таких вещей существует rc, в OpenOS. Сейчас я расскажу вам, что это за зверь, где он живет и зачем он нам. Немного теории Итак, все скрипты для rc хранятся в папочке /etc/rc.d/. Любой файл с расширением .lua, который находится там, является rc-скриптом. У такого скрипта все глобальные функции это команды. Запустить такую команду можно командой rc <имя скрипта, без расширения> <имя команды>. Например если мы создадим глобальную функцию start в файлике /etc/rc.d/test.lua, то запустив команду rc test start эта команда выполнится. Все просто. Получить список команд определенного скрипта можно при помощи команды rc <имя скрипта, без расширения>. Например так: rc test. RC сам создает некоторые команды, хотя мы их можем переопределить: enable/disable. Соответственно включают/выключают скрипт. Все включенные скрипты получат команду start при запуске компьютера. restart если есть start и stop. Перезапускает скрипт, то есть поочередно запускает stop и start. Каждый скрипт можно конфигурировать. Конфиг находится в /etc/rc.cfg. Формат файла прост: <имя скрипта> = <конфиг: все что угодно, таблица, текст, число> По сути это обычный луа-файл, все глобальные значения из которого считаются полями. Каждый скрипт может получить доступ к своему конфигу. Конфиг записывается в переменную args. С теорией покончено, приступим к практике! Практика Я предлагаю написать простой эхо-сервер. Он будет слушать определенный порт (из конфига), и отвечать на любое сообщение эхом. Начнем! Создадим файл /etc/rc,d/echo.lua, и начнем писать в нем код. Нам понадобятся некоторые переменные -- нам понадобятся библиотека event -- что бы установить свой обработчик событий local event = require("event") -- еще нам нужна библиотека computer -- что бы подключить компонент `modem` local component = require("component") -- будем считать количество ответов -- зачем? для диванных аналитиков конечно! local count = 0 -- будем хранить текущее положение -- что б никто не запустил случайно сервер два раза local started = false -- сюда запишем прокси модема, когда убедимся что он есть local modem -- а сюда запишем рабочий порт local port Создадим обработчик события modem_message. Он будет вызываться при каждом сообщении по сетевой карте. -- функция ниже будет запускаться -- при каждом сообщении по сетевой плате local function onModemMessage(_, _, snd, prt, _, ...) -- `_` в нашем понимании - неиспользуемый аргумент -- если порт сообщения не совпадает с портом -- из конфига, выходим print(prt) if prt ~= port then return end -- добавим еденицу к счетчику count = count + 1 -- здесь мы уверены, что modem существует -- так как обработчик поставится только если у нас есть модем modem.send(snd, prt, ...) -- / | \ -- получатель, порт, данные -- просто напросто пересылаем отправителю то что он -- отправил нам =) end Теперь мы добавим команду start, которая запустит наш сервер. -- функция ниже глобальная, `local` нет. -- потому _rc_ ее будет смело считать командой -- а команда эта будет запускать наш сервер function start() -- мы должны проверить, есть ли у нашего сервера -- сетевая карта if not component.isAvailable("modem") then -- если ее нет, мы выводим ошибку и выходим io.stderr:write("Сетевая карта не найдена!") return end -- еще нам нужно проверить, выключены ли мы -- если это не так, снова ошибка if started then io.stderr:write("Сервер уже запущен!") return end count = 0 -- сбросим счетчик started = true -- теперь мы знаем, что с этого момента -- сервер включен. port = args or 666 -- args это переменная, в которую _rc_ запишет данные из конфига -- конфиг находится в /etc/rc.cfg -- но если в конфиге порт не настроен, используем дефолтный modem = component.modem -- мы проверили, что модем существует, -- поэтому смело его подключаем -- откроем порт modem.open(port) -- нам нужно сделать так, что бы все сообщения -- по сетевой карте обслуживались нашей функцией event.listen("modem_message", onModemMessage) -- ну а теперь мы точно включились! end Куда без команды stop? Добавим ее! -- эта функция тоже глобальная, поэтому считаем ее командой -- эта команда остановит сервер function stop() -- мы должны проверить, включен ли вообще сервер -- если он не включен, какой толк его выключать, верно? if not started then -- если он не включен, выводим ошибку и выходим io.stderr:write("Сервер уже выключен!") return end count = 0 -- опять же сбрасываем счетчик started = false -- запоминаем, что теперь -- сервер выключен -- теперь нам нужно по-настоящему выключить сервер event.ignore("modem_message", onModemMessage) -- все! с этого момента сервер выключен, и не принимает сообщение end Еще самая малость, добавим команду printCount, которая будет отображать количество полученных сообщений. -- и это тоже команда, думаю вы понимаете -- а эта команда напишет количество отправленных сообщений function printCount() -- выводить информацию будем только если сервер не запущен -- поэтому выведем ошибку, если он не включен if not started then io.stderr:write("Сервер выключен!") return end print(count) -- пишем количество подключений -- диванные аналитики ликуют! end Ну вот и все, программа сделана, диванные аналитики ликуют, инженеры недоумевают. Полный код: Время QA! Симулируем Васю Пупкина... А вот уже на другом компьютере отправлено сообщение на работающий сервер. Счетчик тоже работает. Установим значение в конфиге. Проверим... Все работает, инженеры ликуют! Такую систему очень удобно использовать для всяческих серверов. Сервер может спокойно работать в фоне, а в главном потоке спокойно можно запускать консоль сервера, интерпретатор луа, rm -rf / ... Enjoy!
  9. Одного диска второро уровня не хватает и хочу управлять домом на расстоянии. Как можно такое сделать?
  10. Начал разработку собственной операционной системы В будущем: Установщик (Возможно даже сегодня сделаю, мне лень прямо сейчас) Разрешения для приложений Нормальная графическая оболочка Защита компа по паролю и touch id Возможно даже sudo Многозадачность (Да-да, я откопал библиотеку 2015 года и она работает до сих пор. Возможно как нибудь задействую. Индикаторы ОЗУ, батареи и ПЗУ Установка приложений (Нормальная, а не методом лома) Дистрибутив для plan9k (Ну я 4ист хз, там даже на русиян ленгуаге нельзя писать, возможно, юникод не поддерживается, ну я ещё разберусь там) Антивирус Поддержка карт из computronics Настройки. Всё, что я использовал или буду использовать в разработке: Можно будет сделать для рекавери мода Для лога и ещё много чего. Многопоток, можно будет хоть и криво, но реализовать функции индикаторов и нескольких приложений Настрое4ки Что бы полосы по краям не мешали Диалоговые окна и окна ошибок тач айди Спасибо Exeteres за помощь Основная библиотека на первое время Установил, а потом решил, что лучше я сам эти координаты буду вбивать Мб буду зачем-то использовать Установщик будет позже, пока что вот моя сборка: https://yadi.sk/d/IivIGHGWIv5yzg
  11. Некоторое время назад возникла необходимость иметь доступ к файлам с разных компьютеров. Для такого уже есть программка от @Zer0Galaxy, но ей невозможно пользоваться, поскольку сервер падает при открытии файла (ибо модем заставляют переслать таблицу с функциями файла, а он в такое не умеет). В октябре я засел писать свою версию (еще не зная о программе "FTP"), писал с большими перерывами, а потому первая более-менее рабочая версия у меня получилась только сейчас. Данная система работает несколько иначе, она выделяет под сервер не определенную папку, а диск целиком, являясь, фактически, прокси-прослойкой между диском сервера и ОС клиента, также на стороне сервера есть два уровня логирования запросов (в текстовый файл). "Лэйбл" передается напрямую с реального удаленного диска, адрес тоже соответствует реальному, но без всех тире и с приставкой "-rfs". Посмотреть весь код можно на ГитХабе Как развернуть сеть: Про режимы работы и уровни логирования: Примите во внимание, что обмен сетевыми пакетами требует некоторого времени, поэтому чтение/запись данных (особенно малыми блоками) может занять продолжительное время. Возможно, в будущем, попробую снизить задержки. Еще, если кто-то нашел в программах баг или недоработку (а таких может быть много), просьба сразу сообщить об этом. А если вы еще и скажете, как решить эту проблему, то цены вам не будет))).
  12. Требуется программа для обслуживания казино с раздатчиком. +(AЕ) На вашем сервере не играю был бы рад бесплатной помощи , но так как заказ сложный думаю сможем договориться.)) Идея состоит в том чтобы стоял буферный сундук в него клали блок железа или внутри игровую валюту адаптер другое должен видеть что билет для игры положили, после компьютер отдает сигнал другому интерфейсу с раздатчиком в него поступает вещь выпадение которой определяется шансем в программе, а ну и чтобы активировал раздатчик) Писать в личку или в этот топик
  13. ESC11

    EscOS

    Вот моё представления графической оболочки.Это концепт. Буду юзать GUI либу @ECS Я рЕшИл написать графическую оболочку для openos. Когда напишу перемещу в раздел графика. Обновления тут
  14. Пытаюсь реализовать следующую идею: запуск OpenOS на устройстве без локального жесткого диска. Сделать это хочу так(псевдокод): Программа на EEPROM, клиент [ Связывается по связанной плате с другим компом, у которого есть жесткий диск Просит адрес компонента filesystem сообщением "component.primary" При помощи vcomponent добавляет виртуальный компонент filesystem, который является отражением удаленного hdd Каждое обращение к функциям этого компонента отправляет сообщения "component.invoke" по сети и ждет ответа Дальше обычный lua_bios ] Программа на сервере для обычной OpenOS [ Ждем сообщений Реагируем соответствующим образом component.primary=>send(адрес компонента) component.invoke=>send(результат вызова функции компонента) ] Также стоит отметить, что при работе с filesystem header файла является userdata, его нельзя сериализовать(насколько я понял), поэтому вместо передачи его по сети передается объект, который можно однозначно сопоставить хедеру на сервере: таблица вида {special = <id>} Сделал, но в результате OpenOS не грузится дальше загрузочного экрана, консоль не появляется. Подскажите, где я ошибся? Исходники: Client Server Тестировал при помощи bibi
  15. Fingercomp

    OpenOS. Потоки

    Потоки — очень полезные штуки, позволяющие исполнять несколько кусков кода. Раньше для их использования приходилось скачивать отдельную библиотеку, работающую через костыли. Начиная с 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()) --> running t: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 end end) 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() end end) local inputThread = thread.create(function() while true do local input = io.read() if input == "exit" then break end end end) thread.waitForAny({inputThread, moveThread}) os.exit(0) Если вы запустите эту программу, то должны заметить, что вы ничего не сможете написать в роботе, хотя работает io.read. Дело в том, что функция robot.forward вызывает метод компонента, который блокирует исполнение компьютера. Пока робот двигается, на компьютере не может выполняться ни одна команда. Чтобы хоть что-то можно было вставить в строку, то поставьте после robot.forward какой-нибудь os.sleep(0) — он позволит соседнему потоку принять и обработать события. Тем не менее, строка ввода всё равно будет работать с тормозами. В подобном случае задумайтесь над тем, чтобы использовать вместо строки ввода иное средство коммуникации: редстоун, сеть, интернет-сокет. Несмотря на всё, библиотека действительно облегчает работу с потоками в OpenOS. Кроме того, очень удобно поместить все слушатели событий в один поток, чтобы они все автоматически были удалены после убийства потока. local event = require("event") 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) end end) -- событие interrupted не ловится обработчиками local intThread = thread.create(function() event.pull("interrupted") end) thread.waitForAny({mainThread, intThread}) os.exit(0) Не нужно функции сохранять в переменные и помнить, что нужно ставить event.ignore в конце программы; не требуется ребутать компьютер, если программа завершилась с ошибкой, а до отключения слушателей дело не дошло. В общем, красота.
  16. Я решил через код получить информацию о подключённых дисках, но не нашёл информации на эту тему. У меня есть папка mnt в ней C диск и я хочу получить о нём информацию.
  17. И так, я уже отчаялся и решил обратиться сюда. Какие вы знаете способы обработки событий и выполнение функций в фоне? Перебираем всевозможные варианты. -event.timer() -event.listen() Есть что-нибудь еще?
  18. Лазил я по стандартным либам OpenOS и понял, что ничего не понимаю. К примеру: component.list("screen")() Зачем тут вторые скобки? :/ Но вообще вопрос вот в чем. Сталкивались ли вы с подробным описанием базовых либ OpenOS, пусть даже на английском. Хотелось бы подробненько прочитать.
  19. Быстренько перевел мануалы, чтобы новичкам было легче ориентироваться, могут быть ошибки, ибо писал в блокноте не проверяя пунктуацию и грамматику. Чтобы установить русификатор, необходимо вставить в компьютер интернет плату и запустить в консоли команду: pastebin run hxLrBAPb
×
×
  • Создать...