Такая ситуация: 1. имеем некую внешнюю C-библиотеку подключенную через "require". В ней создаётся объект и в "вечном" цикле идёт работа с его свойствами/методами. 2. в основном скрипте есть коллбеки в которых идёт своя работа 3. также, в основном скрипте есть код, который не находится в коллбеках и в "майне". --------------------- а теперь, вопросы: а)правильно ли я понимаю порядок выполнения этой программы: Сначала выполняется п.3, потом, п.1. если есть/приходит колбек то, выполнение п.1 приостанавливается на время обработки коллбека и далее возобновляется? б) если сделать "вечный" цикл в одном из коллбеков - то, работа "другого вечного цикла в библиотеке" приостановится на неопределённое время?
--------------- вопросы на самом деле - не глупые, но просто требуют окончательного уточнения
Michael Bulychev
Гость
19.02.2015 11:53:04
Добрый день. а) да, скрипт выполняется весь один раз при загрузке. б) необязательно, зависит от реализации
Пользователь
Сообщений: Регистрация: 01.02.2015
19.02.2015 11:54:29
в) как происходит/реализован механизм переключения между прерыванием работы кода из подключенной библиотеки на момент прихода коллбека?
Пользователь
Сообщений: Регистрация: 01.02.2015
19.02.2015 11:57:11
на самом деле, как Вы наверно поняли - я про vclua. там есть message loop, есть одна "мега"-оконная функция, которая ретранслирует по надобности сообщения другим контролам. вот и интересует механизм прерывания этой петли на время прихода колбека.
Michael Bulychev
Гость
19.02.2015 11:57:35
Никак.
Пользователь
Сообщений: Регистрация: 01.02.2015
19.02.2015 11:58:57
насчёт вариантов реализации - то тут не особо много вариантов. если только не делать на стороне квика wathchdog по предельному времени работы колбека.
Михаил, я уже объяснил вполне доступно: есть стандартный message loop в библиотеке, есть код в коллбеках - и то и то вполне себе параллельно работают. как? напрашивается ответ, что на время прихода коллбеках идёт переключение работы кода на них, а потом возобновление работы кода из message loop библиотеки. и причём, без потоков и корутин.
Michael Bulychev
Гость
19.02.2015 12:17:52
Цитата
sam063rus пишет: Михаил, я уже объяснил вполне доступно: есть стандартный message loop в библиотеке, есть код в коллбеках - и то и то вполне себе параллельно работают. как? напрашивается ответ, что на время прихода коллбеках идёт переключение работы кода на них, а потом возобновление работы кода из message loop библиотеки. и причём, без потоков и корутин.
в qlua.dll создается два отдельных стека Lua - для колбеков и для main(). Обращение к глобальным данным из этих функций синхронизировано средствами Lua.
Пользователь
Сообщений: Регистрация: 01.02.2015
19.02.2015 12:18:14
вы не ответили.
как у вас происходит/реализовано программно прерывание работы скрипта на время обработки кода из коллбека?
Пользователь
Сообщений: Регистрация: 01.02.2015
19.02.2015 12:19:55
я сейчас про майн вообще молчу. с пётлёй в библиотеке скрипт не останавливается и без всякого майна.
как у вас происходит/реализовано программно прерывание работы скрипта на время обработки кода из коллбека?
Ответил - никак. Это разные потоки операционной системы. Стеки существуют независимо друг от друга. Но доступ к глобальным данным синхронизован. Это значит что:
Код
x=1
function OnParam()
...
x=2
...
end
function main()
...
x=3
...
end
OnParam и main исполняются в разных потоках OC, но при обращении к x, произойдет блокировка, изменение данных и разблокировка.
Пользователь
Сообщений: Регистрация: 01.02.2015
19.02.2015 12:34:40
ну вот, опять main. я же говорю, что колбеки и петля в библиотеки работают независимо и псевдопараллельно. вопрос: как?
Пользователь
Сообщений: Регистрация: 01.02.2015
19.02.2015 12:36:04
в рамках реализации вызова require из основного тела скрипта (не из майн) - всё работает в одном потоке.
Пользователь
Сообщений: Регистрация: 01.02.2015
19.02.2015 12:38:33
то есть, вопрос, по сути, можно развернуть так: есть петля в теле скрипта (без майн), есть коллбеки. на время коллбеков петля в скрипте прерывается и идёт обработка коллбека. как?
Пользователь
Сообщений: Регистрация: 01.02.2015
19.02.2015 12:41:22
подозреваю, что возможно у коллбеков своё отличное от другой части скрипта состояние (дочернее). а с вашей стороны уже идёт в qlua учитывание всего этого (мы сейчас не про синхронизацию, про само переключение)
Michael Bulychev
Гость
19.02.2015 12:43:58
Цитата
sam063rus пишет: то есть, вопрос, по сути, можно развернуть так: есть петля в теле скрипта (без майн), есть коллбеки. на время коллбеков петля в скрипте прерывается и идёт обработка коллбека. как?
я не знаю, честно.
Пользователь
Сообщений: Регистрация: 30.01.2015
Роботорговец
19.02.2015 12:55:07
Цитата
Michael Bulychev пишет: OnParam и main исполняются в разных потоках OC, но при обращении к x, произойдет блокировка, изменение данных и разблокировка.
Другими словами, использование простых переменных (строковых, числовых, булевых...) потокобезопасно, в отличие от таблиц?
Надо делать так, как надо. А как не надо - делать не надо.
Michael Bulychev
Гость
19.02.2015 13:00:34
да. С таблицами обеспечивается только "физическая" целостность, не логическая.
Пользователь
Сообщений: Регистрация: 01.02.2015
19.02.2015 13:00:46
ну замечательно...
попытаюсь "ответить" за вас: обычно, из примеров кода "из интернетов" - делают, что-то такое:
Код
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
}
Пользователь
Сообщений: Регистрация: 01.02.2015
19.02.2015 13:06:49
имеется ввиду не весь скрипт, а строчка из него, конечно
Michael Bulychev
Гость
19.02.2015 13:08:39
Цитата
sam063rus пишет: имеется ввиду не весь скрипт, а строчка из него, конечно
Вас интересует возможность прервать выполнение скрипта из программы или что-то другое?
Пользователь
Сообщений: Регистрация: 01.02.2015
19.02.2015 13:11:31
я просто пока не могу понять, как скрипт прерывается при приходе очередного колбека (без всяких майнов и прочего). вот и всё. если у вас нет ответа на мой - я постараюсь найти его сам. но это очень прискорбно, что я не могу найти ответа на такой, казалось бы простой вопрос тут.
Пользователь
Сообщений: Регистрация: 01.02.2015
19.02.2015 13:15:08
Цитата
Серж пишет: при обращении к x, произойдет блокировка, изменение данных и разблокировка.
значит ли это, что Вы в qlua переопределили стандартные макросы lua_lock/lua_unlock с пустышек на критические секции или, что/то в этом духе? и если да - то и нам можно теперь ими пользоваться?
Michael Bulychev
Гость
19.02.2015 13:18:08
Цитата
sam063rus пишет: я просто пока не могу понять, как скрипт прерывается при приходе очередного колбека (без всяких майнов и прочего). вот и всё. если у вас нет ответа на мой - я постараюсь найти его сам. но это очень прискорбно, что я не могу найти ответа на такой, казалось бы простой вопрос тут.
прервать выполнение кода на луа можно: 1. Повесить хук на отладчик. 2. В определенных ситуация можно сказать yeld / resume 3. Сделать lua_lock/lua_unlock
Серж пишет: при обращении к x, произойдет блокировка, изменение данных и разблокировка.
значит ли это, что Вы в qlua переопределили стандартные макросы lua_lock/lua_unlock с пустышек на критические секции или, что/то в этом духе? и если да - то и нам можно теперь ими пользоваться?
Да, значит. Пользоваться можно на свой страх и риск. никакой гарантии далее мы дать не можем.
Пользователь
Сообщений: Регистрация: 01.02.2015
19.02.2015 13:21:22
но ведь вы же как-то периодических вызываете с помощью своих колбеков функции из user-кода?
Michael Bulychev
Гость
19.02.2015 13:23:51
Цитата
sam063rus пишет: но ведь вы же как-то периодических вызываете с помощью своих колбеков функции из user-кода?
Пример приведите, пожалуйста, чтобы говорить об одном и том же.
Пользователь
Сообщений: Регистрация: 01.02.2015
19.02.2015 13:24:39
Михаил, не будем разводить тут "писанину" на 100 страниц - просто приведите если не затруднит в псевдо-коде" тот кусочек кода, который отвечает у вас за вызов и работу коллбеков. остальное, попытаюсь "додумать" сам...
Пользователь
Сообщений: Регистрация: 01.02.2015
19.02.2015 13:33:48
к пример: OnAllTrades. Как вы забиндили у себя этот коллбек? как он у вас вызывается, в каком цикле, как работает/приостанавливается работа основного скрипта пользователя. если можно, как указал выше - напишите в "псевдокоде".
Пользователь
Сообщений: Регистрация: 01.02.2015
19.02.2015 13:36:09
какая существует очередность при вызове колбеков и обработки user-кода (пользовательских скриптов)
Michael Bulychev
Гость
19.02.2015 13:39:09
Если мы вызываем код из скрипта, то биндить ничего не надо
Код
lua_getglobal(L, "OnAllTrade")
lua_pushtable(L, trade) //псевдокод
lua_pcall(L, 1, 0, 0) //зависит от вашей функции и наличия обработчика ошибок
//обработка результатов если они есть
Пользователь
Сообщений: Регистрация: 01.02.2015
19.02.2015 13:45:06
но ведь колбеки не последовательно выполняются с телом скрипта, а в нужный момент. а если в этот момент пользователь выполнял какой-то свой код?
Michael Bulychev
Гость
19.02.2015 13:47:56
Теперь Ваша очередь писать псевдокод. Пример скрипта напишите, чтобы было что обсуждать.
Пользователь
Сообщений: Регистрация: 01.02.2015
19.02.2015 13:50:37
получается, если рассуждать по вашей логике, то имеем:
Код
код состороны квика:
исполняем тело скрипта клиента
запускаем майн-тред
уходим в цикл ожидания событий по колбекам
если есть колбек - выполняем
если есть OnStop - прибиваем майн
майн сдох - прибиваем объект "скрипт"
Пользователь
Сообщений: Регистрация: 01.02.2015
19.02.2015 14:01:17
тело скрипта:
Код
require("vclua")
OnAllTrades()
--взяли сделку
end
OnStop()
mainwindow:free()
end
vclua:
Код
Application.Run
repeat
case message of
wm_1:
....
wm_2:
показали сделку
...
wm_3:
...
until message == wm_quit
Application.Terminate
Пользователь
Сообщений: Регистрация: 30.01.2015
19.02.2015 18:08:18
Добрый день, утомился я читать эту перепалку что-то. ----------------------------------- попробую ответить, чтобы ускорить обсуждение. ------------------------------------------ колбеки - это обычная функция в глобальной таблице скрипта. ------------------------------------- если у вас есть бесконечный цикл в скрипте, то колбек никогда не вызовется и квик повиснет. --------------------------- собственно майн для того и сделан, чтобы обеспечить работу скрипта вне основного потока колбеков т е тела скрипта вне майн. ------------------------------ Надеюсь , что объяснил понятно.
Николай, так объяснять - надо в первоклассникам, а лучше - не объяснять вовсе. Меня такие объяснения не устроят.
p.s. насчёт своего вопроса - разобрался. Описанный мной пример - оказался несовсем точным. В vclua - идёт неполная инициализация объекта Application. Так что, вопрос снимается.
Пользователь
Сообщений: Регистрация: 01.02.2015
19.02.2015 19:24:18
Цитата
Николай Камынин пишет: попробую ответить, чтобы ускорить обсуждение.
есть предложение: ускоряй любые обсуждения на своём сайте.
Пользователь
Сообщений: Регистрация: 02.02.2015
миру мир!
19.02.2015 22:38:47
Цитата
sam063rus пишет: Михаил, я уже объяснил вполне доступно: есть стандартный message loop в библиотеке, есть код в коллбеках - и то и то вполне себе параллельно работают. как? напрашивается ответ, что на время прихода коллбеках идёт переключение работы кода на них, а потом возобновление работы кода из message loop библиотеки. и причём, без потоков и корутин.
Нет, не так. Вы несколько не понимаете как работает цикл обработки сообщений. А работает он просто (речь про ОДИН поток): пришло сообщение - обработали в соотв. оконной функции (полностью!). Никакого прерывания этого процесса - нет. И снова вышли в цикл выборки следующего сообщения. Пришло другое сообщение - снова обработали, т.е. вызвали оконную функцию и в ней обработали. (кстати, не обязательно оконную, обработчик можно вешать просто на поток, без окна, на сколько я помню). Так что если вы вошли в организованный вами цикл обработки сообщений и в нем стоите, а колбэки отрабатывают - значит колбеки вызываются из обработчиков каких-то сообщений.
Подозреваю, речь про ProcessMessages ? или все же про ShowModal?
Пользователь
Сообщений: Регистрация: 02.02.2015
миру мир!
19.02.2015 22:40:26
Цитата
sam063rus значит ли это, что Вы в qlua переопределили стандартные макросы lua_lock/lua_unlock с пустышек на критические секции или, что/то в этом духе? и если да - то и нам можно теперь ими пользоваться?
Слава небесам! Неужто таки догадался?
Пользователь
Сообщений: Регистрация: 02.02.2015
миру мир!
19.02.2015 22:42:55
Цитата
sam063rus пишет: но ведь колбеки не последовательно выполняются с телом скрипта, а в нужный момент. а если в этот момент пользователь выполнял какой-то свой код?
Вначале ПОЛНОСТЬЮ выполняется тело скрипта (все, что вне ккаих-либо функций) отом последовательно дергаются колбеки, но НИКОГДА ни один из них не прерывается ничем другим. Если в колбеке устроить бесконечный цикл - квик повиснет там навсегда.
sam063rus значит ли это, что Вы в qlua переопределили стандартные макросы lua_lock/lua_unlock с пустышек на критические секции или, что/то в этом духе? и если да - то и нам можно теперь ими пользоваться?
Слава небесам! Неужто таки догадался?
я создал эту тему не "догадываться", а постараться получить чёткий ответ от разработчиков законными методами. поэтому многие многие вопросы для кого-то кажутся глупыми, о чём я заранее предупредил вначале топика:
Цитата
-------------- вопросы на самом деле - не глупые, но просто требуют окончательного уточнения
Пользователь
Сообщений: Регистрация: 01.02.2015
20.02.2015 10:15:48
задам другой вопрос: значит ли, что:
когда основное тело скрипта выполнится
и при условии отсутствия каких-либо колбеков в скрипте (за исключением OnStop),
а также при отсутствии в скрипте функции main -
скрипт полностью закончит свою работу, а вместе с ним и его виртуальная машина полностью закончит работу/будет разрушена?
Пользователь
Сообщений: Регистрация: 01.02.2015
21.02.2015 08:22:05
и последний вопрос: из материалов с других форумов - мы знаем, что "main" запускается (а вместе с ней и создаётся отдельный поток) после колбека "OnInit" - значит ли это, что, если в скрипте не будет прописан колбек OnInit - то и для функции "main" не будет создан отдельный поток???
-------------------- этот, как и предыдущий вопрос относится не только к Михаилу, но и к другим разработчикам.
Пользователь
Сообщений: Регистрация: 23.01.2015
24.02.2015 08:20:35
Цитата
sam063rus пишет: и последний вопрос: из материалов с других форумов - мы знаем, что "main" запускается (а вместе с ней и создаётся отдельный поток) после колбека "OnInit" - значит ли это , что, если в скрипте не будет прописан колбек OnInit - то и для функции "main" не будет создан отдельный поток???
-------------------- этот, как и предыдущий вопрос относится не только к Михаилу, но и к другим разработчикам.
Нет не значит. И как-то комментировать то что сказано на других форумах считаем излишним.