Zer0Galaxy 2 187 Опубликовано: 2 апреля, 2015 Ценою неимоверных усилий удалось портировать уже известную вам библиотеку thread в ОС. Библиотека доступна для скачивания по команде Установка: pastebin get E0SzJcCx /lib/thread.lua [код] По сравнению с версией для СС, библиотека имеет еще две функции, вызываемых без параметров: thread.init() - инициализирует многозадачный режим. Должна вызываться один раз перед вызовом других функций библиотеки. thread.waitForAll() - ожидает завершения всех дочерних потоков. В отличии от СС-версии, дочерние потоки прерываются при завершении родительского. Поэтому, waitForAll следует вызывать в конце основной программы, чтобы дать возможность дочерним завершиться корректно. Функции create, kill и killAll работают аналогично версии для СС. thread.create(f , ...) - создает поток, который сразу же начинает выполняться параллельно основному потоку. При желании можно создать серию потоков, вызвав функцию create несколько раз подряд. В качестве параметра f необходимо указать функцию, содержащую тело потока. После f можно указать параметры, передаваемые ей. Функция create возвращает вновь созданный поток как объект типа нить ("thread"). Значение это может понадобиться если вы захотите прервать принудительно созданный поток. thread.kill(co) - прерывает выполнение параллельного потока. co - завершаемый поток, значение, полученное при вызове функции create. thread.killAll() - прекращает выполнение всех параллельных потоков, за исключением основного. Пример работы с библиотекой: local thread = require("thread") -- Инициализируем многозадачность thread.init() -- Функция, которая выводит строку str несколько раз с интервалом секунда function foo(str,n) for i=1,n do print(str) os.sleep(1) end end -- Запускаем два экземпляра функции с разными параметрами thread.create(foo,"AAA",5) thread.create(foo,"BBB",7) -- Ждем завершения thread.waitForAll() Результат работы программы 13 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Alex 4 683 Опубликовано: 2 апреля, 2015 ВOOOOOOOOOOOOOOT!!!! НАКОНЕЦ!!!!! СПАСИБО, ДМИТРИЙ!!!! ЭТО ЭПИК!!!! Еще и с параметрами запуск! Могу это только сравнить с полетом Гагарина в космос высадкой американцев на Луну. Дождались. Фуууууух! Это может и маленький шажок для программистов всего человечества , но огромный шаг для работы с модом ОС! Спасибо, Дима, за титаническую работу! Дима, не знаю, как тебя благодарить даже! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
1Ridav 1 049 Опубликовано: 2 апреля, 2015 Ценою неимоверных усилий удалось портировать уже известную вам библиотеку thread в ОС. Библиотека доступна для скачивания по команде pastebin get E0SzJcCx thread.lua По сравнению с версией для СС, библиотека имеет еще две функции, вызываемых без параметров: thread.init() - инициализирует многозадачный режим. Должна вызываться один раз перед вызовом других функций библиотеки. thread.waitForAll() - ожидает завершения всех дочерних потоков. Функции create, kill и killAll работают аналогично версии для СС. Пример работы с библиотекой: local thread = require("thread") -- Инициализируем многозадачность thread.init() -- Функция, которая выводит строку str несколько раз с интервалом секунда function foo(str,n) for i=1,n do print(str) os.sleep(1) end end -- Запускаем два экземпляра функции с разными параметрами thread.create(foo,"AAA",5) thread.create(foo,"BBB",7) -- Ждем завершения thread.waitForAll() Результат работы программы test.png У меня 2 вопроса: 1 - thread'ы убиваются сами после завершения функции или их надо убивать в ручную? 2 - Можно ли убивать thread'ы вручную не дожидаясь их завершения? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 2 апреля, 2015 У меня 2 вопроса:1 - thread'ы убиваются сами после завершения функции или их надо убивать в ручную? 2 - Можно ли убивать thread'ы вручную не дожидаясь их завершения? 1. Насильного убийства не присходит. Когда функция завершается, её поток принимает статус "dead" автоматически, после чего он исключается из списка активных потоков и удаляется сборщиком мусора. 2. Да. Для этого нужно сохранить значение, возвращаемое функцией create, и вызвать kill Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
1Ridav 1 049 Опубликовано: 2 апреля, 2015 Было бы очень хорошо, если бы ты документировал все API в этой теме. Как что называется, что делает и что возвращает. в деталях. Плюс привел несколько примеров использования Я реально буду её использовать для своей управления с андроида , уже думал, что придется свое писать, но еще не приступил к написанию. Прямо подарок судьбы Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Krutoy 1 169 Опубликовано: 3 апреля, 2015 Давным давно пользуюсь либой под СС, чень удобно! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 3 апреля, 2015 Было бы очень хорошо, если бы ты документировал все API в этой теме. Как что называется, что делает и что возвращает. в деталях. Плюс привел несколько примеров использования В первом посте я попытался вкратце рассказать про все функции библиотеки и привел примерчик. Давным давно пользуюсь либой под СС, чень удобно! Ввиду особенностей программирования событий, либа под ОС несколько отличается, а посему требует дополнительного тестирования. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO 541 Опубликовано: 3 апреля, 2015 Документацию пожалуйста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zucker 21 Опубликовано: 17 сентября, 2015 В исходном коде я не могу понять, откуда " _timeout " взялось (берется), кто его присваивает или я что-то упустил? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 17 сентября, 2015 Это максимальное время ожидания события. Оно указывается при вызове функций computer.pullSignal, os.sleep или event.pull Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zucker 21 Опубликовано: 17 сентября, 2015 (изменено) Это максимальное время ожидания события. Оно указывается при вызове функций computer.pullSignal, os.sleep или event.pull А каким образом оно передает. Как я понял когда "сопрограмма" выполняет os.sleep(), то она каким-то образом переходит в другую программу, но как она передает _timeout ? Имел ввиду, что при вызове computer.pullSignal, os.sleep(), event.pull что происходит дальше? Изменено 17 сентября, 2015 пользователем Pavel52 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 17 сентября, 2015 Это вопрос не к библиотеке thread, а к библиотеке coroutin. Когда сопрограмма вызывает os.sleep, фактически вызывается coroutin.yield (см. исходник os). При этом управление передается ядру системы. В качестве параметра передается таймаут. Ядро возвращает управление сопрограмме либо по получению сигнала либо по прошествии таймаута. При использовании thread происходит тоже самое, только роль ядра для дочерних потоков играет основной поток. 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zucker 21 Опубликовано: 21 октября, 2015 (изменено) Возникла проблема при попытке сделать поток с «computer.pullSignal()» если не указывать время ожидания, то библиотека выдает ошибку, что я попыталась сравнить string and number. Но можно просто установить таймер на подольше и будет все отлично) Изменено 21 октября, 2015 пользователем Pavel52 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 22 октября, 2015 Возникла проблема при попытке сделать поток с «computer.pullSignal()» если не указывать время ожидания, то библиотека выдает ошибку, что я попыталась сравнить string and number. Но можно просто установить таймер на подольше и будет все отлично) Благодарю за багрепорт. Исправлено. Скачайте либу по той же ссылке. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zucker 21 Опубликовано: 25 октября, 2015 Почему он мертв?) /lib/thread.lua:28: cannot resume dead coroutine ... Какие ошибочные действия могли привести к этому? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
evgkul 571 Опубликовано: 25 октября, 2015 Почему он мертв?) /lib/thread.lua:28: cannot resume dead coroutine ... Какие ошибочные действия могли привести к этому? Походу поток завершится успел, а ты его пытаешься возобновить Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zucker 21 Опубликовано: 25 октября, 2015 Походу поток завершится успел, а ты его пытаешься возобновить Как это решить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 26 октября, 2015 Как это решить? Код в студию 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zucker 21 Опубликовано: 26 октября, 2015 (изменено) Код в студию local thread = require("thread"); thread.init() local function f1() print("hello1"); end; local function f2() thread.create(f2) thread.create(f1); print("hello2"); end; thread.create(f2); thread.waitForAll(); Изменено 26 октября, 2015 пользователем Pavel52 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy Автор темы 2 187 Опубликовано: 26 октября, 2015 local thread = require("thread"); thread.init() local function f1() print("hello1"); end; local function f2() thread.create(f2) thread.create(f1); print("hello2"); end; thread.create(f2); thread.waitForAll(); Не пойму, чего ты этим хотел добиться. Если тело потока не содержит бесконечных циклов и вызовов pullSignal, то такой поток выполняется целиком после чего благополучно умирает. Т.е. твой код можно с успехом заменить на local function f1() print("hello1"); end; local function f2() f2() f1(); print("hello2"); end; f2(); Только по идее вылететь мы должны были по переполнению памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах