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

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

Рекомендуемые сообщения

Не пойму, чего ты этим хотел добиться. Если тело потока не содержит бесконечных циклов и вызовов pullSignal, то такой поток выполняется целиком после чего благополучно умирает. Т.е. твой код можно с успехом заменить на 

local function f1()
  print("hello1");
end;

local function f2()
    f2()
    f1();
    print("hello2");
end;

f2();

Только по идее вылететь мы должны были по переполнению памяти.

 

Этот бесконечный цикл предполагался, что каждый проход создает отдельный процесс и в конце своего выполнения они заканчивались.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Никогда не используй рекурсию с целью создания бесконечного цикла. Для этого существует while true do

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В данном случае, основное назначение функции - содержать тело потока, а не возвращать результат. Если очень нужно, результат можно вернуть через глобальную переменную.

Конечно, можно подправить библиотеку и генерировать событие по завершению потока, а параметром события передавать возвращаемое значение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В данном случае, основное назначение функции - содержать тело потока, а не возвращать результат. Если очень нужно, результат можно вернуть через глобальную переменную.

Конечно, можно подправить библиотеку и генерировать событие по завершению потока, а параметром события передавать возвращаемое значение.

Я даже не знаю, как это реализовать. Пример event.pull(), которая приостанавливает цикл(в моем случае).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я, похоже, не правильно понял вопрос. О каких функциях идет речь и какие значения они должны возвращать? Если можно, пример кода

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я, похоже, не правильно понял вопрос. О каких функциях идет речь и какие значения они должны возвращать? Если можно, пример кода

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

Изменено пользователем Arseniy10

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Используй 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) --убираем эвент
Изменено пользователем qwertyMAN

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Используй 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) --убираем эвент

Благодарю!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

...

 

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

local function onKeyDown()
  -- ...
end

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

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

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

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

Изменено пользователем LeshaInc

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

Используй 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) --убираем эвент

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

"Прежде чем решать задачу, подумайте что будете делать с её результатом".

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
руки оторвать за такой стиль, надо так:

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

Надо так:

-- Автор 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну вот пример. Мне нужно выводить какое-то значение на экран, которое постоянно изменяется. И параллельно принимать сигнал от 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...