Zucker 21 Опубликовано: 26 октября, 2015 Не пойму, чего ты этим хотел добиться. Если тело потока не содержит бесконечных циклов и вызовов pullSignal, то такой поток выполняется целиком после чего благополучно умирает. Т.е. твой код можно с успехом заменить на local function f1() print("hello1"); end; local function f2() f2() f1(); print("hello2"); end; f2(); Только по идее вылететь мы должны были по переполнению памяти. Этот бесконечный цикл предполагался, что каждый проход создает отдельный процесс и в конце своего выполнения они заканчивались. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 26 октября, 2015 Никогда не используй рекурсию с целью создания бесконечного цикла. Для этого существует while true do 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Arseniy10 50 Опубликовано: 19 августа, 2016 А как же быть с функциями, которые возвращают что-нибудь? 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 19 августа, 2016 В данном случае, основное назначение функции - содержать тело потока, а не возвращать результат. Если очень нужно, результат можно вернуть через глобальную переменную. Конечно, можно подправить библиотеку и генерировать событие по завершению потока, а параметром события передавать возвращаемое значение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Arseniy10 50 Опубликовано: 19 августа, 2016 В данном случае, основное назначение функции - содержать тело потока, а не возвращать результат. Если очень нужно, результат можно вернуть через глобальную переменную. Конечно, можно подправить библиотеку и генерировать событие по завершению потока, а параметром события передавать возвращаемое значение. Я даже не знаю, как это реализовать. Пример event.pull(), которая приостанавливает цикл(в моем случае). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 19 августа, 2016 Я, похоже, не правильно понял вопрос. О каких функциях идет речь и какие значения они должны возвращать? Если можно, пример кода Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Arseniy10 50 Опубликовано: 19 августа, 2016 (изменено) Я, похоже, не правильно понял вопрос. О каких функциях идет речь и какие значения они должны возвращать? Если можно, пример кода Ну вот пример. Мне нужно выводить какое-то значение на экран, которое постоянно изменяется. И параллельно принимать сигнал от event.pull(), чтобы можно было взаимодействовать. Ибо во время вызова этой функции приостанавливается программа. Изменено 19 августа, 2016 пользователем Arseniy10 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
qwertyMAN 1 722 Опубликовано: 19 августа, 2016 (изменено) Ну вот пример. Мне нужно выводить какое-то значение на экран, которое постоянно изменяется. И параллельно принимать сигнал от 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) --убираем эвент Изменено 19 августа, 2016 пользователем qwertyMAN Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
TraerTaer 39 Опубликовано: 19 августа, 2016 Можешь в вайле тру ду вызывать функцию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Arseniy10 50 Опубликовано: 19 августа, 2016 Используй 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) --убираем эвент Благодарю! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
LeshaInc 624 Опубликовано: 19 августа, 2016 (изменено) ... руки оторвать за такой стиль, надо так: local function onKeyDown() -- ... end event.lister("key_down", onKeyDown) -- устанавливаем обработчик while true do -- ... os.sleep(0.25) -- 1 секунда слишком долго end event.ignore("key_down", onKeyDown) -- убираем обработчик я лично оторву Изменено 19 августа, 2016 пользователем LeshaInc Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 148 Опубликовано: 19 августа, 2016 руки оторвать за такой стиль, надо так: ... os.sleep(0.25) -- 1 секунда слишком долго ...я лично оторву Я в прошлом году так ногу сломал. Стиль изменился до неузнаваемости, но я так и не понял, почему 1 секунда – слишком долго, а 0.25 – приемлемо. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Arseniy10 50 Опубликовано: 20 августа, 2016 Используй 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) --убираем эвент Стоп. А как мне получить информацию? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO 541 Опубликовано: 20 августа, 2016 В майне и так ~15 потоков разных, тут логично что они по всем ядрам распараллеливаются. Смотри системный монитор использования ядер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Seryoga 184 Опубликовано: 20 августа, 2016 Стоп. А как мне получить информацию? Один профессор из моего университета говорил ("-л", так как у меня кончились его пары): "Прежде чем решать задачу, подумайте что будете делать с её результатом". Так вот зачем тебе это надо? Я например не могу придумать, где это может понадобиться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
qwertyMAN 1 722 Опубликовано: 20 августа, 2016 (изменено) руки оторвать за такой стиль, надо так: О боже, что я вижу, за такое руки ломать надо. Надо так: -- Автор qwertyMAN -- Не крадите прогу пожалуйста. Грешно. local function e1() -- <код> -- ... -- </код> end event.lister("key_down", e1) -- устанавливаем обработчик while 1 do -- <код> -- ... -- </код> os.sleep(0) -- 0.25 секунд слишком долго end event.ignore("key_down", e1) -- убираем обработчик Лично отломаю. Изменено 20 августа, 2016 пользователем qwertyMAN Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
qwertyMAN 1 722 Опубликовано: 20 августа, 2016 Стоп. А как мне получить информацию? Я мысли читать не могу. для примера написал print, а там в аргументы что хочешь подставляй. Я то не знаю что ты хотел выводить на экран. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 22 августа, 2016 (изменено) Ну вот пример. Мне нужно выводить какое-то значение на экран, которое постоянно изменяется. И параллельно принимать сигнал от 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, как предлагалось выше. Изменено 22 августа, 2016 пользователем Zer0Galaxy 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 22 августа, 2016 Заметил когда-то давно интересную особенность этой всей кухни. Если один поток работает без слипов, хоть даже каких-то микроскопических, например, черепашка едет в бесконечном цикле прямо, а второй тред, например, ожидает в ивент.пулле что-то, например команды по wi-fi "Стоп" для разрыва этого безудержного путешествия черепашонка, то тут наступает грустишка и никак не удается сдвинуть и оживить второй поток. Он просто наглухо висит мертво и ему не отводится никакого времени на обработку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 22 августа, 2016 Заметил когда-то давно интересную особенность этой всей кухни. Если один поток работает без слипов, хоть даже каких-то микроскопических, например, черепашка едет в бесконечном цикле прямо, а второй тред, например, ожидает в ивент.пулле что-то, например команды по wi-fi "Стоп" для разрыва этого безудержного путешествия черепашонка, то тут наступает грустишка и никак не удается сдвинуть и оживить второй поток. Он просто наглухо висит мертво и ему не отводится никакого времени на обработку. Всё дело в том, что переключения между потоками осуществляются по слипам (по computer.pullSignal, если точнее). Слипов нет, и другие потоки управления не получают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах