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


Фотография

Многопоточность в OpenComputers

Многопоточность OpenComputers

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 44

#31 Оффлайн   LeshaInc

LeshaInc

    Растоман

  • Пользователи
  • Сообщений: 1 195
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.
  • ГородЛуна

Награды

                 

Отправлено 20 Август 2016 - 00:51

 

...

 

руки оторвать за такой стиль, надо так:

local function onKeyDown()
  -- ...
end

event.lister("key_down", onKeyDown) -- устанавливаем обработчик

while true do
  -- ... 
  os.sleep(0.25) -- 1 секунда слишком долго
end

event.ignore("key_down", onKeyDown) -- убираем обработчик

я лично оторву


Сообщение отредактировал LeshaInc: 20 Август 2016 - 00:52

  • Saintmare это нравится

#32 Оффлайн   eu_tomat

eu_tomat
  • Хранители Кода
  • Сообщений: 706
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Награды

                    

Отправлено 20 Август 2016 - 01:39

руки оторвать за такой стиль, надо так:

...
os.sleep(0.25) -- 1 секунда слишком долго
...
я лично оторву

Я в прошлом году так ногу сломал. Стиль изменился до неузнаваемости, но я так и не понял, почему 1 секунда – слишком долго, а 0.25 – приемлемо.

  • qwertyMAN это нравится

#33 Оффлайн   Arseniy10

Arseniy10
  • Пользователи
  • Сообщений: 97
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.
  • ГородКаруселин

Отправлено 20 Август 2016 - 11:48

 

Используй event.lister() Он обрабатывает сигналы в режиме ожидания os.sleep(). Таким образом можешь что угодно выводить, но поставить хотя бы os.sleep(0) которого будет достаточно, чтобы обработать эвенты.

 

Например так:

function func()
<код>
end

event.lister("key_down",func) --регистрируем эвент и привязываем события "нажатие клавиши" функцию func()

while true do
print(42) --выводим на экран что хотим
os.sleep(1) --обрабатываем эвенты
end

event.ignore("key_down",func) --убираем эвент

Стоп. А как мне получить информацию?



#34 Оффлайн   NEO

NEO
  • Java
  • Сообщений: 1 669
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.
  • ГородСолнце

Награды

   2                        

Отправлено 20 Август 2016 - 12:26

В майне и так ~15 потоков разных, тут логично что они по всем ядрам распараллеливаются. Смотри системный монитор использования ядер.



#35 Оффлайн   Seryoga

Seryoga
  • Пользователи
  • Сообщений: 107
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.
  • ГородSaint-Petersburg

Награды

        

Отправлено 20 Август 2016 - 13:58

Стоп. А как мне получить информацию?

Один профессор из моего университета говорил ("-л", так как у меня кончились его пары):
"Прежде чем решать задачу, подумайте что будете делать с её результатом".

Так вот зачем тебе это надо? Я например не  могу придумать, где это может понадобиться.



#36 Оффлайн   qwertyMAN

qwertyMAN
  • Пользователи
  • Сообщений: 1 384
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.
  • ГородCity17

Награды

                             

Отправлено 20 Август 2016 - 15:40

руки оторвать за такой стиль, надо так:

О боже, что я вижу, за такое руки ломать надо.

Надо так:

-- Автор qwertyMAN
-- Не крадите прогу пожалуйста. Грешно.

local function e1()
  -- <код>
  -- ...
  -- </код>
end
 
event.lister("key_down", e1) -- устанавливаем обработчик
 
while 1 do
  -- <код>
  -- ...
  -- </код>
  os.sleep(0) -- 0.25 секунд слишком долго
end
 
event.ignore("key_down", e1) -- убираем обработчик

Лично отломаю.


Сообщение отредактировал qwertyMAN: 20 Август 2016 - 15:59


#37 Оффлайн   qwertyMAN

qwertyMAN
  • Пользователи
  • Сообщений: 1 384
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.
  • ГородCity17

Награды

                             

Отправлено 20 Август 2016 - 16:01

Стоп. А как мне получить информацию?

Я мысли читать не могу. для примера написал print, а там в аргументы что хочешь подставляй. Я то не знаю что ты хотел выводить на экран. 



#38 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Автор темы
  • Гуру
  • Сообщений: 1 196
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Награды

5                                 

Отправлено 22 Август 2016 - 17:20

Ну вот пример. Мне нужно выводить какое-то значение на экран, которое постоянно изменяется. И параллельно принимать сигнал от event.pull(), чтобы можно было взаимодействовать. Ибо во время вызова этой функции приостанавливается программа.

local thread = require("thread")
-- Инициализируем многозадачность
thread.init()

function foo()
  while true do
    print(какое-то значение)
    os.sleep(1)
  end
end

-- Запускаем функцию в виде параллельного потока
thread.create(foo)

while true do
  e={event.pull()}
  -- что-то там
end

Особенность многопоточности в том, что event.pull и os.sleep притормаживают только тот поток, в котором вызываются. Остальные потоки работают как работали.

А вообще, для данной задачи, многопоточность слишком сложное решение. Лучше использовать event.timer или event.listen, как предлагалось выше.


Сообщение отредактировал Zer0Galaxy: 22 Август 2016 - 17:21

  • unknown это нравится

#39 Оффлайн   Alex

Alex
  • Администраторы
  • Сообщений: 3 510
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Отправлено 22 Август 2016 - 17:37

Заметил когда-то давно интересную особенность этой всей кухни. Если один поток работает без слипов, хоть даже каких-то микроскопических, например, черепашка едет в бесконечном цикле прямо, а второй тред, например, ожидает в ивент.пулле что-то, например команды по wi-fi "Стоп" для разрыва этого безудержного путешествия черепашонка, то тут наступает грустишка и никак не удается сдвинуть и оживить второй поток. Он просто наглухо висит мертво и ему не отводится никакого времени на обработку.



#40 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Автор темы
  • Гуру
  • Сообщений: 1 196
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Награды

5                                 

Отправлено 22 Август 2016 - 18:14

Заметил когда-то давно интересную особенность этой всей кухни. Если один поток работает без слипов, хоть даже каких-то микроскопических, например, черепашка едет в бесконечном цикле прямо, а второй тред, например, ожидает в ивент.пулле что-то, например команды по wi-fi "Стоп" для разрыва этого безудержного путешествия черепашонка, то тут наступает грустишка и никак не удается сдвинуть и оживить второй поток. Он просто наглухо висит мертво и ему не отводится никакого времени на обработку.

Всё дело в том, что переключения между потоками осуществляются по слипам (по computer.pullSignal, если точнее). Слипов нет, и другие потоки управления не получают.



#41 Оффлайн   Alex

Alex
  • Администраторы
  • Сообщений: 3 510
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Отправлено 22 Август 2016 - 19:12

Всё дело в том, что переключения между потоками осуществляются по слипам (по computer.pullSignal, если точнее). Слипов нет, и другие потоки управления не получают.

угу, в этом и суть грустишки. Ну ладно, спасибо=) 



#42 Оффлайн   Totoro

Totoro
  • Хранители Кода
  • Сообщений: 1 663
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Награды

                                      

Отправлено 22 Август 2016 - 20:19

Корутины - такие корутины.. =)



#43 Оффлайн   eu_tomat

eu_tomat
  • Хранители Кода
  • Сообщений: 706
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Награды

                    

Отправлено 23 Август 2016 - 10:32

Не вижу оснований для грусти. Добавить sleep в код не сложно, а параллелизм достигается другим путём.

Уже давно мы обсудили его в теме про турели, где обсуждение было удалено как оффтоп. Суть его в том, что проблема нехватки энергии или слотов в отдельном роботе несущественна, т.к. увеличение количества роботов увеличивает и суммарное количество слотов всей робо-системы.

Аналогично достигается и параллелизм. Например, хочется, чтобы робот принимал решения во время движений, а не между ними, особенно, когда принятие решений требует значительного времени. Но у робота есть возможность делегировать принятие решений серверу, тем временем выполняя физическую работу. Сервер же может часть своей работы раздать другим серверам.

Конечно, не все задачи можно решить таким образом. Например, робот не сможет выполнять высокочастотные радужные переливы во время движения или посылать высокочастотные (опять же) сигналы редстоуном во время добычи блока, но и практического применения у этих задач тоже нет.

  • NEO и davial это нравится

#44 Оффлайн   MasterOfShadow

MasterOfShadow
  • Пользователи
  • Сообщений: 3
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Отправлено 22 Февраль 2017 - 20:55

при остановке программы из примера в шапке по ctrl+alt+c спамит в консоль строкой ^с.



#45 Оффлайн   MasterOfShadow

MasterOfShadow
  • Пользователи
  • Сообщений: 3
  • Уровень сигнала: 0%
  • В игре: 0 ч. 0 мин.

Отправлено 22 Февраль 2017 - 21:03

исправил добавив 2 строчки перед error(param)

computer.pullSignal = computer.SingleThread
computer.pushSignal("AllThreadsDead")

  • Zer0Galaxy это нравится





Темы с аналогичным тегами Многопоточность, OpenComputers

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных