Просмотр задачи

НомерПроектКатегорияВидимостьИзменен
0001746Lua API[SimpleTV] Предложениепубличная2021-06-14 17:46
ИнициаторSergeyVS ОтветственныйSergeyVS  
ПриоритетобычныйВлияниенововведениеВоспроизводимостьнеприменимо
Состояние решенаРешениерешена 
Версия продукта[SimpleTV] 0.5.0 b12.7.6 (x32/x64) 
Целевая версия[SimpleTV] 0.5.0 b12.7.7 (x32/x64)Решена в версии[SimpleTV] 0.5.0 b12.7.7 (x32/x64) 
Тема0001746: lua API m_simpleTV.Threads
ОписаниеNew class of API
http://iptv.gen12.net/dokuwiki/doku.php?id=mantis:simpletv:api:threads
Example in attached file
МеткиНет связанных меток.
Вложенные файлы

Деятельность

BM

2021-06-10 18:34

руководитель   ~0035030

тут возник вопрос по callback функциях внутри потока,

тестовый аддон прилагаю, запускается по crtl+shift+M,
предполагается вывод надписи на osd и манипуляции с ней, закрытие и смена текста,
сейчас все работает но если запускать скрипт через thread, то callback-функция (mousePressEventFunction например) не находиться.
изменение стиля запуска в run.lua : ThreadStyle = 1

testThreads_module.7z (2,308 байт)

SergeyVS

2021-06-13 15:34

администратор   ~0035034

Потоки работают в разных виртуальных машинах, соответственно прямого доступа к переменным и функциям одного потока у другого потока нет, Все взаимодействие только через m_simpleTV.Threads.Call(...). И callback-и которые вызваются из ядра, вызываютя на главном потоке. Подправил пример (run.lua)

testThreads_module1.7z (2,349 байт)

BM

2021-06-14 11:57

руководитель   ~0035041

Последние изменения: 2021-06-14 12:28

Просмотр 3 редакций

>>Потоки работают в разных виртуальных машинах

А есть какое-то ограничение в памяти адресуемой в VM?
Потому что вот такой вызов ну никак не работает в моем случае, (в коротком примере - все ок) :
я по максимуму упростил все, даже обращение к треду заменил на вывод сообщения:
   m_simpleTV.Threads.Call( id, [[ m_simpleTV.OSD.ShowMessage_UTF8("=== Call ===") ]] )
   ( id точно тот, который нужен - IsAlive(id) == true )

SergeyVS

2021-06-14 13:44

администратор   ~0035042

Последние изменения: 2021-06-14 16:11

Просмотр 2 редакций

Каких то специфичных ограничений нет. А что делает в это время вызываемый поток, если там что такое
while true do ... end
то вызов будет висеть в очереди, пока скрипт не вернет управление ядру.

BM

2021-06-14 14:27

руководитель   ~0035043

Последние изменения: 2021-06-14 14:31

Просмотр 2 редакций

>> А что делает в это время вызываемый поток

 обновления плейлистов идут, сообщения выводятся на OSD, в debug_in_file() данные выводится, обращения к базе sql , в общем, нормально все..
а вызов Call() никакой реакции не дает.

PS заметил, что если допустить ошибку , например вставить где-нибудь debug_in_file({}), то поток видимо прерывается и Call() начинает срабатывать

SergeyVS

2021-06-14 15:44

администратор   ~0035044

>>обновления плейлистов идут,
Т.е. скрипт постоянно работает в цикле и управление не возвращает?

>> то поток видимо прерывается и Call() начинает срабатывать
Поток не прерывается, прерывается текущий скрипт и управление передается ядру.

call не прерывает выполнение текущего скрипта в вызываемом потоке (иначе UB будет), скрипт ставится в очередь
и будет выполнен когда текущий скрипт закончит работу

BM

2021-06-14 16:33

руководитель   ~0035045

Т.е. чтобы обратиться к callback-функции ее нужно определить в ядре, а обращение к ней произойдет после того как скрипт, запущенный в треде, закончит работу и вернет управление ядру?

Может внутри треда добавить что-то вроде m_simpleTV.Threads.ResumeCalll( m_simpleTV.ThreadsCurrentThreadId() ) - при обращении к которой , выполнялись бы вызовы накопленные в очереди m_simpleTV.Threads.Call ?

SergeyVS

2021-06-14 17:22

администратор   ~0035046

В ядре ни чего определять не надо,
>>а обращение к ней произойдет после того как скрипт, запущенный в треде, закончит работу и вернет управление ядру?
Да, новый скрипт будет запущен после выполнения текущего.

>>Может внутри треда добавить что-то вроде m_simpleTV.Threads.ResumeCalll ...
Нет. Во первых нет никаких гарантий что стек VM будет в том же состоянии и велика опасность рекурсивного вызова и переполнения стека.

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

function nextcycle()
   .....

  m_simpleTV.Threads.Call ( m_simpleTV.Threads.CurrentThreadId(), 'nextcycle()')
 return --здесь завершаем скрипт и передаем управление ядру
end

BM

2021-06-14 17:46

руководитель   ~0035047

@SergeyVS
в целом суть ясна, спасибо

История изменений

Дата изменения Пользователь Поле Изменить
2020-12-22 16:42 SergeyVS Новая задача
2020-12-22 16:42 SergeyVS Состояние новая => назначена
2020-12-22 16:42 SergeyVS Ответственный => SergeyVS
2020-12-22 16:43 SergeyVS Файл добавлен: luaScr.7z
2020-12-22 16:44 SergeyVS Описание изменено Просмотр редакций
2020-12-22 16:47 SergeyVS Проект SimpleTV => Lua API
2020-12-22 16:47 SergeyVS Состояние назначена => подтверждена
2020-12-22 16:55 SergeyVS Файл удалён: luaScr.7z
2020-12-22 16:56 SergeyVS Файл добавлен: luaScr.7z
2020-12-22 16:56 SergeyVS Файл удалён: luaScr.7z
2020-12-22 16:57 SergeyVS Файл добавлен: luaScr.7z
2020-12-22 17:01 SergeyVS Файл удалён: luaScr.7z
2020-12-22 17:02 SergeyVS Файл добавлен: luaScr.7z
2020-12-27 12:52 SergeyVS Состояние подтверждена => решена
2020-12-27 12:52 SergeyVS Решение открыта => решена
2020-12-27 12:52 SergeyVS Решена в версии => 0.5.0 b12.7.7 (x32/x64)
2021-06-10 18:34 BM Файл добавлен: testThreads_module.7z
2021-06-10 18:34 BM Комментарий добавлен: 0035030
2021-06-13 15:34 SergeyVS Файл добавлен: testThreads_module1.7z
2021-06-13 15:34 SergeyVS Комментарий добавлен: 0035034
2021-06-14 11:57 BM Комментарий добавлен: 0035041
2021-06-14 12:25 BM Комментарий изменен: 0035041 Просмотр редакций
2021-06-14 12:28 BM Видимость комментария: 0035041: приватная
2021-06-14 12:28 BM Видимость комментария: 0035041: публичная
2021-06-14 12:28 BM Комментарий изменен: 0035041 Просмотр редакций
2021-06-14 13:44 SergeyVS Комментарий добавлен: 0035042
2021-06-14 14:27 BM Комментарий добавлен: 0035043
2021-06-14 14:31 BM Комментарий изменен: 0035043 Просмотр редакций
2021-06-14 15:44 SergeyVS Комментарий добавлен: 0035044
2021-06-14 16:11 SergeyVS Комментарий изменен: 0035042 Просмотр редакций
2021-06-14 16:33 BM Комментарий добавлен: 0035045
2021-06-14 17:22 SergeyVS Комментарий добавлен: 0035046
2021-06-14 17:46 BM Комментарий добавлен: 0035047