Такая ситуация: 1. имеем некую внешнюю C-библиотеку подключенную через "require". В ней создаётся объект и в "вечном" цикле идёт работа с его свойствами/методами. 2. в основном скрипте есть коллбеки в которых идёт своя работа 3. также, в основном скрипте есть код, который не находится в коллбеках и в "майне". --------------------- а теперь, вопросы: а)правильно ли я понимаю порядок выполнения этой программы: Сначала выполняется п.3, потом, п.1. если есть/приходит колбек то, выполнение п.1 приостанавливается на время обработки коллбека и далее возобновляется? б) если сделать "вечный" цикл в одном из коллбеков - то, работа "другого вечного цикла в библиотеке" приостановится на неопределённое время?
--------------- вопросы на самом деле - не глупые, но просто требуют окончательного уточнения
на самом деле, как Вы наверно поняли - я про vclua. там есть message loop, есть одна "мега"-оконная функция, которая ретранслирует по надобности сообщения другим контролам. вот и интересует механизм прерывания этой петли на время прихода колбека.
Михаил, я уже объяснил вполне доступно: есть стандартный message loop в библиотеке, есть код в коллбеках - и то и то вполне себе параллельно работают. как? напрашивается ответ, что на время прихода коллбеках идёт переключение работы кода на них, а потом возобновление работы кода из message loop библиотеки. и причём, без потоков и корутин.
sam063rus пишет: Михаил, я уже объяснил вполне доступно: есть стандартный message loop в библиотеке, есть код в коллбеках - и то и то вполне себе параллельно работают. как? напрашивается ответ, что на время прихода коллбеках идёт переключение работы кода на них, а потом возобновление работы кода из message loop библиотеки. и причём, без потоков и корутин.
в qlua.dll создается два отдельных стека Lua - для колбеков и для main(). Обращение к глобальным данным из этих функций синхронизировано средствами Lua.
как у вас происходит/реализовано программно прерывание работы скрипта на время обработки кода из коллбека?
Ответил - никак. Это разные потоки операционной системы. Стеки существуют независимо друг от друга. Но доступ к глобальным данным синхронизован. Это значит что:
Код
x=1
function OnParam()
...
x=2
...
end
function main()
...
x=3
...
end
OnParam и main исполняются в разных потоках OC, но при обращении к x, произойдет блокировка, изменение данных и разблокировка.
то есть, вопрос, по сути, можно развернуть так: есть петля в теле скрипта (без майн), есть коллбеки. на время коллбеков петля в скрипте прерывается и идёт обработка коллбека. как?
подозреваю, что возможно у коллбеков своё отличное от другой части скрипта состояние (дочернее). а с вашей стороны уже идёт в qlua учитывание всего этого (мы сейчас не про синхронизацию, про само переключение)
sam063rus пишет: то есть, вопрос, по сути, можно развернуть так: есть петля в теле скрипта (без майн), есть коллбеки. на время коллбеков петля в скрипте прерывается и идёт обработка коллбека. как?
попытаюсь "ответить" за вас: обычно, из примеров кода "из интернетов" - делают, что-то такое:
Код
beginthread
while script1.executed
doscript.1()
end
while script2.executed
doscript.2()
end
while script3.executed
doscript.3()
end
endthread
doscript.N()
{
if FOnParam then
do
pcall(OnParam,...)
continueScript()
end
else
runScript()
end
}
я просто пока не могу понять, как скрипт прерывается при приходе очередного колбека (без всяких майнов и прочего). вот и всё. если у вас нет ответа на мой - я постараюсь найти его сам. но это очень прискорбно, что я не могу найти ответа на такой, казалось бы простой вопрос тут.
Серж пишет: при обращении к x, произойдет блокировка, изменение данных и разблокировка.
значит ли это, что Вы в qlua переопределили стандартные макросы lua_lock/lua_unlock с пустышек на критические секции или, что/то в этом духе? и если да - то и нам можно теперь ими пользоваться?
sam063rus пишет: я просто пока не могу понять, как скрипт прерывается при приходе очередного колбека (без всяких майнов и прочего). вот и всё. если у вас нет ответа на мой - я постараюсь найти его сам. но это очень прискорбно, что я не могу найти ответа на такой, казалось бы простой вопрос тут.
прервать выполнение кода на луа можно: 1. Повесить хук на отладчик. 2. В определенных ситуация можно сказать yeld / resume 3. Сделать lua_lock/lua_unlock
Серж пишет: при обращении к x, произойдет блокировка, изменение данных и разблокировка.
значит ли это, что Вы в qlua переопределили стандартные макросы lua_lock/lua_unlock с пустышек на критические секции или, что/то в этом духе? и если да - то и нам можно теперь ими пользоваться?
Да, значит. Пользоваться можно на свой страх и риск. никакой гарантии далее мы дать не можем.
Михаил, не будем разводить тут "писанину" на 100 страниц - просто приведите если не затруднит в псевдо-коде" тот кусочек кода, который отвечает у вас за вызов и работу коллбеков. остальное, попытаюсь "додумать" сам...
к пример: OnAllTrades. Как вы забиндили у себя этот коллбек? как он у вас вызывается, в каком цикле, как работает/приостанавливается работа основного скрипта пользователя. если можно, как указал выше - напишите в "псевдокоде".
Если мы вызываем код из скрипта, то биндить ничего не надо
Код
lua_getglobal(L, "OnAllTrade")
lua_pushtable(L, trade) //псевдокод
lua_pcall(L, 1, 0, 0) //зависит от вашей функции и наличия обработчика ошибок
//обработка результатов если они есть
получается, если рассуждать по вашей логике, то имеем:
Код
код состороны квика:
исполняем тело скрипта клиента
запускаем майн-тред
уходим в цикл ожидания событий по колбекам
если есть колбек - выполняем
если есть OnStop - прибиваем майн
майн сдох - прибиваем объект "скрипт"
Добрый день, утомился я читать эту перепалку что-то. ----------------------------------- попробую ответить, чтобы ускорить обсуждение. ------------------------------------------ колбеки - это обычная функция в глобальной таблице скрипта. ------------------------------------- если у вас есть бесконечный цикл в скрипте, то колбек никогда не вызовется и квик повиснет. --------------------------- собственно майн для того и сделан, чтобы обеспечить работу скрипта вне основного потока колбеков т е тела скрипта вне майн. ------------------------------ Надеюсь , что объяснил понятно.
Николай, так объяснять - надо в первоклассникам, а лучше - не объяснять вовсе. Меня такие объяснения не устроят.
p.s. насчёт своего вопроса - разобрался. Описанный мной пример - оказался несовсем точным. В vclua - идёт неполная инициализация объекта Application. Так что, вопрос снимается.
sam063rus пишет: Михаил, я уже объяснил вполне доступно: есть стандартный message loop в библиотеке, есть код в коллбеках - и то и то вполне себе параллельно работают. как? напрашивается ответ, что на время прихода коллбеках идёт переключение работы кода на них, а потом возобновление работы кода из message loop библиотеки. и причём, без потоков и корутин.
Нет, не так. Вы несколько не понимаете как работает цикл обработки сообщений. А работает он просто (речь про ОДИН поток): пришло сообщение - обработали в соотв. оконной функции (полностью!). Никакого прерывания этого процесса - нет. И снова вышли в цикл выборки следующего сообщения. Пришло другое сообщение - снова обработали, т.е. вызвали оконную функцию и в ней обработали. (кстати, не обязательно оконную, обработчик можно вешать просто на поток, без окна, на сколько я помню). Так что если вы вошли в организованный вами цикл обработки сообщений и в нем стоите, а колбэки отрабатывают - значит колбеки вызываются из обработчиков каких-то сообщений.
Подозреваю, речь про ProcessMessages ? или все же про ShowModal?
sam063rus значит ли это, что Вы в qlua переопределили стандартные макросы lua_lock/lua_unlock с пустышек на критические секции или, что/то в этом духе? и если да - то и нам можно теперь ими пользоваться?
sam063rus пишет: но ведь колбеки не последовательно выполняются с телом скрипта, а в нужный момент. а если в этот момент пользователь выполнял какой-то свой код?
Вначале ПОЛНОСТЬЮ выполняется тело скрипта (все, что вне ккаих-либо функций) отом последовательно дергаются колбеки, но НИКОГДА ни один из них не прерывается ничем другим. Если в колбеке устроить бесконечный цикл - квик повиснет там навсегда.
sam063rus значит ли это, что Вы в qlua переопределили стандартные макросы lua_lock/lua_unlock с пустышек на критические секции или, что/то в этом духе? и если да - то и нам можно теперь ими пользоваться?
Слава небесам! Неужто таки догадался?
я создал эту тему не "догадываться", а постараться получить чёткий ответ от разработчиков законными методами. поэтому многие многие вопросы для кого-то кажутся глупыми, о чём я заранее предупредил вначале топика:
Цитата
-------------- вопросы на самом деле - не глупые, но просто требуют окончательного уточнения
и последний вопрос: из материалов с других форумов - мы знаем, что "main" запускается (а вместе с ней и создаётся отдельный поток) после колбека "OnInit" - значит ли это, что, если в скрипте не будет прописан колбек OnInit - то и для функции "main" не будет создан отдельный поток???
-------------------- этот, как и предыдущий вопрос относится не только к Михаилу, но и к другим разработчикам.
sam063rus пишет: и последний вопрос: из материалов с других форумов - мы знаем, что "main" запускается (а вместе с ней и создаётся отдельный поток) после колбека "OnInit" - значит ли это , что, если в скрипте не будет прописан колбек OnInit - то и для функции "main" не будет создан отдельный поток???
-------------------- этот, как и предыдущий вопрос относится не только к Михаилу, но и к другим разработчикам.
Нет не значит. И как-то комментировать то что сказано на других форумах считаем излишним.