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

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

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

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

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

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


Блоги

  • Робот Байт
  • Fingercomp's Playground
  • 1Ridav' - блог
  • Totoro Cookies
  • Блог cyber01
  • IncluderWorld
  • KelLiN' - блог
  • Крутой блог
  • eutomatic blog
  • Programist135 Soft
  • Сайт в сети OpenNet
  • PieLand
  • Очумелые ручки
  • Блог недоблоггера
  • В мире Майнкрафт
  • LaineBlog
  • Квантовый блог
  • Блог qwertyMAN'а
  • some blog name
  • Дача Игоря
  • Тут был Артур.

Форумы

  • Программирование
    • Программы
    • База знаний
    • Разработчикам
    • Вопросы
  • Игровой раздел
    • Игровые серверы
    • Предложения по улучшению игрового процесса
    • Моды и плагины
    • Жалобы на игроков
    • Ивенты
  • Общение
    • Вопрос-ответ
    • Беседка программистов
    • Беседка-флудилка
    • Шкатулка
  • Технический раздел
    • Багтрекер
    • Архив

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

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


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

  • Начать

    Конец


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

  • Начать

    Конец


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

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

  • Начать

    Конец


Группа


AIM


MSN


Сайт


ICQ


Yahoo


Jabber


Skype


ВКонтакте


Gtalk


Facebook


Twitter


Город


Интересы

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

  1. Доброго времени суток, посетители форума. Эта игра создана для мода OpenComputers версии 1.5 и выше. Она сделана в традициях игр '2D RPG для одного игрока', но вид не сверху, а сбоку (нет ширины, только длина и высота). И кстати, подобных и лучше игр в интернете очень много, а для OpenComputers таких пока что больше нет, поэтому сделал для опенкомпов. Ссылки на либы, благодаря которым я смог сделать игру: Thread lib by Zer0Galaxy DoubleBuffering lib by ECS Image lib by ECS ColorLib by ECS Скачать игру: Версия 1.2.7 обн. 5 Ссылка: https://pastebin.com/8ZjNP1y3 Команда для OC: pastebin get 8ZjNP1y3 w16.lua Процесс загрузки занимает 1-2 минуты. 04.05.18: обновление 4. 25.06.18: обновление 5. Требуется интернет-карта в вашем компьютере в minecraft. Краткое описание: Вы находитесь в деревне Зеленый Камень (Greenstone Village), слева находятся квестовый НИП и торговцы/ремесленники, справа стоит стражник. Чтобы поговорить с НИПом, подойдите к нему и нажмите 'E' Также кнопка 'E' используется чтобы собрать ресурс или сундук или зайти в портал. В правом верхнем углу есть две палочки, тык по ним левой кнопкой мышки открывают меню паузы. 1)Кнопка 'Продолжить' закрывает меню паузы. 2)Кнопка 'Инвентарь' открывает ваш рюкзак и показывает все ваши вещи. Тык ПКМ по иконкам некоторых предметов позволяет использовать/надеть/снять вещь/предмет или открыть шкатулку. Тык левой кнопкой показывает описание предмета. 3)Если зайти в раздел 'Умения персонажа', можно увидеть информацию о ваших умениях и изучать их за определенную цену. 4)Характеристика. Информация о вашем персонаже, а также улучшение характеристик героя путем распределения очков, данных за уровень. За 1 уровень персонаж получает 1 балл для распределения. 5)Текущие задания. Информация о ваших квестах, например, какая награда вас ждет за выполнение. 6)Сохранение игры. 7)Загрузка игры. Загружает уже сохраненную ранее игру. 8)Выход из игры. Не предлагает сохраниться, просто останавливает все циклы. Всех, у кого есть полоска здоровья, можно атаковать, а они, кстати тоже могут побить вас. Атаковать монстров можно кнопками 1 2 3 4 5 (пятое нужно активировать в разделе умения персонажа) Из крипов и боссов, подчиняясь великому рандому, вываливаются различные предметы. Если вы получили какой-то ценный предмет, а инвентарь переполнен, можно освободить ячейку в инвентаре (продать, выбросить, использовать), затем снимите игру с паузы, подождите пару секунд. Снова загляните в инвентарь: там должен был появиться тот самый предмет, который не поместился. У НИПов можно покупать/продавать/создавать предметы. У кузнеца покупается и создается оружие, у портного - броня и т.д. *НИП - неигровой персонаж. Версия 28. Что добавлено: Подземелье для 7+ ур. Долина для 11+ ур. Новые локации, квесты, нипы, монстры, боссы, предметы. Мобы и боссы теперь используют свои умения (отравление, сжигание маны и т.п.). Некоторые квесты могут быть взяты повторно. Желтые и зеленые штуковины над НИПами, отображающие состояние квестов у них. Появились накидки и кольца. Можно изучать и увеличивать умения. Добавлен амулет, восстанавливающий здоровье автоматически. Добавлен обрывок книги для изучения умений Что изменилось: Поменял много формул. Некоторые "прямые" формулы изменены на "кривые". Улучшение вещей теперь подчиняется логике. Может быть прикручено одно и тоже улучшение на один предмет несколько раз. Можно продавать НИПам свои вещи из инвентаря. Что исправлено: Полоска хп над мобом/боссом не хотела отображать цифры в некоторых случаях. Эффект на моба при смерти изредка давал ошибку. Ошибочные id предметов давали ошибку. Квесты на поиск предметов криво работали. Исправлены ошибки с крафтом предметов. Куча багов. Все 90 иконок предметов в инвентаре: 1-20 21-40 41-60 61-80 81-90 (это устаревшие изображения)
  2. 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 в конце программы; не требуется ребутать компьютер, если программа завершилась с ошибкой, а до отключения слушателей дело не дошло. В общем, красота.
  3. Как мне параллельно выводить изменяющуюся переменную и захватывать сигнал? event.pull() приостанавливает программу, из-за чего обновление переменной невозможно. event.listen и event.ignore() не подходят, ибо мне нужно получать данные нажатий (x,y), которые я могу получать только с event.pull(). Проблема решена с помощью computer.pullSignal().
×
×
  • Создать...