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


Фотография

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

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

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

#31 Оффлайн   LeshaInc

LeshaInc

    2B

  • Пользователи
  • PipPipPipPipPipPipPip
  • 1 175 сообщений
  • ГородЛуна

Награды

                 

Отправлено 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

    Свой человек

  • Пользователи
  • PipPipPipPipPipPipPip
  • 558 сообщений

Награды

                    

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

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

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

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

#33 Оффлайн   Arseniy10

Arseniy10

    Пользователь

  • Пользователи
  • PipPipPip
  • 92 сообщений
  • ГородКаруселин

Отправлено 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

    Орден К.А.

  • Пользователи
  • PipPipPipPipPipPipPip
  • 1 558 сообщений
  • ГородСолнце

Награды

   2                        

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

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



#35 Оффлайн   Seryoga

Seryoga

    Пользователь

  • Пользователи
  • PipPipPip
  • 91 сообщений
  • ГородSaint-Petersburg

Награды

     

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

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

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

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



#36 Оффлайн   qwertyMAN

qwertyMAN

    Свой человек

  • Пользователи
  • PipPipPipPipPipPipPip
  • 1 319 сообщений
  • Город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

    Свой человек

  • Пользователи
  • PipPipPipPipPipPipPip
  • 1 319 сообщений
  • ГородCity17

Награды

                          

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

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

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



#38 Оффлайн   Zer0Galaxy

Zer0Galaxy

    The Lord of the Pings

  • Автор темы
  • Пользователи
  • PipPipPipPipPipPipPip
  • 1 120 сообщений

Награды

4                                 

Отправлено 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 260 сообщений

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

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



#40 Оффлайн   Zer0Galaxy

Zer0Galaxy

    The Lord of the Pings

  • Автор темы
  • Пользователи
  • PipPipPipPipPipPipPip
  • 1 120 сообщений

Награды

4                                 

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

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

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



#41 Оффлайн   Alex

Alex

    Орден К.А.

  • Администраторы
  • 3 260 сообщений

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

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

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



#42 Оффлайн   Totoro

Totoro

    Свой человек

  • Пользователи
  • PipPipPipPipPipPipPip
  • 1 408 сообщений

Награды

                                      

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

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



#43 Оффлайн   eu_tomat

eu_tomat

    Свой человек

  • Пользователи
  • PipPipPipPipPipPipPip
  • 558 сообщений

Награды

                    

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

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

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

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

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

#44 Оффлайн   MasterOfShadow

MasterOfShadow

    Почетный гость

  • Пользователи
  • 2 сообщений

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

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



#45 Оффлайн   MasterOfShadow

MasterOfShadow

    Почетный гость

  • Пользователи
  • 2 сообщений

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

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

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

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





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

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

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


Яндекс.Метрика