вопрос по коллбекам, к разработчикам (ONLY)

Страницы: 1 2 След.
RSS
вопрос по коллбекам, к разработчикам (ONLY)
 
Такая ситуация:
1. имеем некую внешнюю C-библиотеку подключенную через "require". В ней создаётся объект и в "вечном" цикле идёт работа с его свойствами/методами.
2. в основном скрипте есть коллбеки в которых идёт своя работа
3. также, в основном скрипте есть код, который не находится в коллбеках и в "майне".
---------------------
а теперь, вопросы:
а)правильно ли я понимаю порядок выполнения этой программы:
Сначала выполняется п.3, потом, п.1. если есть/приходит колбек то, выполнение п.1 приостанавливается на время обработки коллбека и далее возобновляется?
б) если сделать "вечный" цикл в одном из коллбеков - то, работа "другого вечного цикла в библиотеке" приостановится на неопределённое время?

---------------
вопросы на самом деле - не глупые, но просто требуют окончательного уточнения
 
Добрый день.
а) да, скрипт выполняется весь один раз при загрузке.
б) необязательно, зависит от реализации
 
в) как происходит/реализован механизм переключения между прерыванием работы кода из подключенной библиотеки на момент прихода коллбека?
 
на самом деле, как Вы наверно поняли - я про vclua. там есть message loop, есть одна "мега"-оконная функция, которая ретранслирует по надобности сообщения другим контролам. вот и интересует механизм прерывания этой петли на время прихода колбека.
 
Никак.
 
насчёт вариантов реализации - то тут не особо много вариантов. если только не делать на стороне квика wathchdog по предельному времени работы колбека.
 
Цитата
Michael Bulychev пишет:
Никак.
чот не понял. в смысле.
 
а в ответ - тишина...
 
Я пока  не очень понимаю о чем идет речь, но вот такую функцию:

Код
lua_register(L, "Loop", MyLoop); 
... 
int MyLoop(lua_State *L) 
{ 
   while(true)  
   { 
      ... 
   } 
   return 0;
}  

лучше не писать.
 
Михаил, я уже объяснил вполне доступно: есть стандартный message loop в библиотеке, есть код в коллбеках - и то и то вполне себе параллельно работают. как? напрашивается ответ, что на время прихода коллбеках идёт переключение работы кода на них, а потом возобновление работы кода из message loop библиотеки. и причём, без потоков и корутин.
 
Цитата
sam063rus пишет:
Михаил, я уже объяснил вполне доступно: есть стандартный message loop в библиотеке, есть код в коллбеках - и то и то вполне себе параллельно работают. как? напрашивается ответ, что на время прихода коллбеках идёт переключение работы кода на них, а потом возобновление работы кода из message loop библиотеки. и причём, без потоков и корутин.
в qlua.dll создается два отдельных стека Lua - для колбеков и для main(). Обращение к глобальным данным из этих функций синхронизировано средствами Lua.
 
вы не ответили.

как у вас происходит/реализовано программно прерывание работы скрипта на время обработки кода из коллбека?
 
я сейчас про майн вообще молчу. с пётлёй в библиотеке скрипт не останавливается и без всякого майна.
 
Цитата
sam063rus пишет:
вы не ответили.

как у вас происходит/реализовано программно прерывание работы скрипта на время обработки кода из коллбека?
Ответил - никак. Это разные потоки операционной системы. Стеки существуют независимо друг от друга. Но доступ к глобальным данным синхронизован. Это значит что:

Код
x=1 
function OnParam() 
   ...
   x=2  
   ...
end 
function main()  
   ...
   x=3 
   ...
end  
OnParam и main исполняются в разных потоках OC, но при обращении к x, произойдет блокировка, изменение данных и разблокировка.
 
ну вот, опять main. я же говорю, что колбеки и петля в библиотеки работают независимо и псевдопараллельно. вопрос: как?
 
в рамках реализации вызова require из основного тела скрипта (не из майн) - всё работает в одном потоке.
 
то есть, вопрос, по сути, можно развернуть так:
есть петля в теле скрипта (без майн), есть коллбеки. на время коллбеков петля в скрипте прерывается и идёт обработка коллбека. как?
 
подозреваю, что возможно у коллбеков своё отличное от другой части скрипта состояние (дочернее). а с вашей стороны уже идёт в qlua учитывание всего этого (мы сейчас не про синхронизацию, про само переключение)
 
Цитата
sam063rus пишет:
то есть, вопрос, по сути, можно развернуть так:
есть петля в теле скрипта (без майн), есть коллбеки. на время коллбеков петля в скрипте прерывается и идёт обработка коллбека. как?
я не знаю, честно.
 
Цитата
Michael Bulychev пишет:
OnParam и main исполняются в разных потоках OC, но при обращении к x, произойдет блокировка, изменение данных и разблокировка.
Другими словами, использование простых переменных (строковых, числовых, булевых...) потокобезопасно, в отличие от таблиц?
Надо делать так, как надо. А как не надо - делать не надо.
 
да. С таблицами обеспечивается только "физическая" целостность, не логическая.
 
ну замечательно...

попытаюсь "ответить" за вас:
обычно, из примеров кода "из интернетов" - делают, что-то такое:

Код
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

}
 
имеется ввиду не весь скрипт, а строчка из него, конечно
 
Цитата
sam063rus пишет:
имеется ввиду не весь скрипт, а строчка из него, конечно
Вас интересует возможность прервать выполнение скрипта из программы или что-то другое?
 
я просто пока не могу понять, как скрипт прерывается при приходе очередного колбека (без всяких майнов и прочего). вот и всё. если у вас нет ответа на мой - я постараюсь найти его сам. но это очень прискорбно, что я не могу найти ответа на такой, казалось бы простой вопрос тут.
 
Цитата
Серж пишет:
при обращении к x, произойдет блокировка, изменение данных и разблокировка.
значит ли это, что Вы в qlua переопределили стандартные макросы lua_lock/lua_unlock с пустышек на критические секции или, что/то в этом духе? и если да - то и нам можно теперь ими пользоваться?
 
Цитата
sam063rus пишет:
я просто пока не могу понять, как скрипт прерывается при приходе очередного колбека (без всяких майнов и прочего). вот и всё. если у вас нет ответа на мой - я постараюсь найти его сам. но это очень прискорбно, что я не могу найти ответа на такой, казалось бы простой вопрос тут.
прервать выполнение кода на луа можно:
1. Повесить хук на отладчик.
2. В определенных ситуация можно сказать yeld / resume
3. Сделать lua_lock/lua_unlock
 
Цитата
sam063rus пишет:
Цитата
Серж пишет:
при обращении к x, произойдет блокировка, изменение данных и разблокировка.
значит ли это, что Вы в qlua переопределили стандартные макросы lua_lock/lua_unlock с пустышек на критические секции или, что/то в этом духе? и если да - то и нам можно теперь ими пользоваться?
Да, значит. Пользоваться можно на свой страх и риск. никакой гарантии далее мы дать не можем.
 
но ведь вы же как-то периодических вызываете с помощью своих колбеков функции из user-кода?
 
Цитата
sam063rus пишет:
но ведь вы же как-то периодических вызываете с помощью своих колбеков функции из user-кода?
Пример приведите, пожалуйста, чтобы говорить об одном и том же.
 
Михаил, не будем разводить тут "писанину" на 100 страниц - просто приведите если не затруднит в псевдо-коде" тот кусочек кода, который отвечает у вас за вызов и работу коллбеков. остальное, попытаюсь "додумать" сам...
 
к пример: OnAllTrades. Как вы забиндили у себя этот коллбек? как он у вас вызывается, в каком цикле, как работает/приостанавливается работа основного скрипта пользователя. если можно, как указал выше - напишите в "псевдокоде".
 
какая существует очередность при вызове колбеков и обработки user-кода (пользовательских скриптов)
 
Если мы вызываем код из скрипта, то биндить ничего не надо

Код
lua_getglobal(L, "OnAllTrade") 
lua_pushtable(L, trade) //псевдокод 
lua_pcall(L, 1, 0, 0) //зависит от вашей функции и наличия обработчика ошибок 
//обработка результатов если они есть
 
но ведь колбеки не последовательно выполняются с телом скрипта, а в нужный момент. а если в этот момент пользователь выполнял какой-то свой код?
 
Теперь Ваша очередь писать псевдокод.
Пример скрипта напишите, чтобы было что обсуждать.
 
получается, если рассуждать по вашей логике, то имеем:

Код
код состороны квика:

исполняем тело скрипта клиента
запускаем майн-тред
уходим в цикл ожидания событий по колбекам
если есть колбек - выполняем
если есть OnStop - прибиваем майн
майн сдох - прибиваем объект "скрипт"
 
тело скрипта:

Код
 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
 
Добрый день,
утомился я читать эту перепалку что-то.
-----------------------------------
попробую ответить, чтобы ускорить обсуждение.
------------------------------------------
колбеки - это обычная функция в глобальной таблице скрипта.
-------------------------------------
если у вас есть бесконечный цикл в скрипте,
то колбек никогда не вызовется и квик повиснет.
---------------------------
собственно майн для того и сделан,
чтобы обеспечить работу скрипта вне основного потока колбеков
т е тела скрипта вне майн.
------------------------------
Надеюсь , что объяснил понятно.
 
Цитата
Николай Камынин пишет:
Надеюсь , что объяснил понятно.
Николай, так объяснять - надо в первоклассникам, а лучше - не объяснять вовсе. Меня такие объяснения не устроят.




p.s. насчёт своего вопроса - разобрался. Описанный мной пример - оказался несовсем точным. В vclua - идёт неполная инициализация объекта Application. Так что, вопрос снимается.
 
Цитата
Николай Камынин пишет:
попробую ответить, чтобы ускорить обсуждение.
есть предложение: ускоряй любые обсуждения на своём сайте.
 
Цитата
sam063rus пишет:
Михаил, я уже объяснил вполне доступно: есть стандартный message loop в библиотеке, есть код в коллбеках - и то и то вполне себе параллельно работают. как? напрашивается ответ, что на время прихода коллбеках идёт переключение работы кода на них, а потом возобновление работы кода из message loop библиотеки. и причём, без потоков и корутин.
Нет, не так.
Вы несколько не понимаете как работает цикл обработки сообщений.
А работает он просто (речь про ОДИН поток): пришло сообщение - обработали в соотв. оконной функции (полностью!). Никакого прерывания этого процесса - нет. И снова вышли в цикл выборки следующего сообщения.
Пришло другое сообщение - снова обработали, т.е. вызвали оконную функцию и в ней обработали. (кстати, не обязательно оконную, обработчик можно вешать просто на поток, без окна, на сколько я помню).
Так что если вы вошли в организованный вами цикл обработки сообщений и в нем стоите, а колбэки отрабатывают - значит колбеки вызываются из обработчиков каких-то сообщений.

Подозреваю, речь про ProcessMessages ? или все же про ShowModal?
 
Цитата
sam063rus значит ли это, что Вы в qlua переопределили стандартные макросы lua_lock/lua_unlock с пустышек на критические секции или, что/то в этом духе? и если да - то и нам можно теперь ими пользоваться?
Слава небесам!
Неужто таки догадался?
 
Цитата
sam063rus пишет:
но ведь колбеки не последовательно выполняются с телом скрипта, а в нужный момент. а если в этот момент пользователь выполнял какой-то свой код?
Вначале ПОЛНОСТЬЮ выполняется тело скрипта (все, что вне ккаих-либо функций) отом последовательно дергаются колбеки, но НИКОГДА ни один из них не прерывается ничем другим.
Если в колбеке устроить бесконечный цикл - квик повиснет там навсегда.
 
Цитата
sam063rus пишет: vclua:
Код
 Application.Run
 repeat
case message of
wm_1:
....
wm_2:
показали сделку
...
wm_3:
...
until message == wm_quit

Application.Terminate
 
Важный момент: vclua - это dll-ка, а для нее все не так.
 
Цитата
swerg пишет:
Важный момент: vclua - это dll-ка, а для нее все не так.
знаю, что не так. уже написал выше, что в vclua не задействован метод Application.Run.  
 
Цитата
swerg пишет:
Цитата
sam063rus значит ли это, что Вы в qlua переопределили стандартные макросы lua_lock/lua_unlock с пустышек на критические секции или, что/то в этом духе? и если да - то и нам можно теперь ими пользоваться?
Слава небесам!
Неужто таки догадался?
я создал эту тему не "догадываться", а постараться получить чёткий ответ от разработчиков законными методами. поэтому многие многие вопросы для кого-то кажутся глупыми, о чём я заранее предупредил вначале топика:
Цитата
--------------
вопросы на самом деле - не глупые, но просто требуют окончательного уточнения
 
Michael Bulychev

задам другой вопрос: значит ли, что:
  • когда основное тело скрипта выполнится
  • и при условии отсутствия каких-либо колбеков в скрипте (за исключением OnStop),
  • а также при отсутствии в скрипте функции main -
скрипт полностью закончит свою работу, а вместе с ним и его виртуальная машина полностью закончит работу/будет разрушена?
 
и последний вопрос:
из материалов с других форумов - мы знаем, что "main" запускается (а вместе с ней и создаётся отдельный поток) после колбека "OnInit" - значит ли это, что, если в скрипте не будет прописан колбек OnInit - то и для функции "main" не будет создан отдельный поток???

--------------------
этот, как и предыдущий вопрос относится не только к Михаилу, но и к другим разработчикам.
 
Цитата
sam063rus пишет:
и последний вопрос:
из материалов с других форумов - мы знаем, что "main" запускается (а вместе с ней и создаётся отдельный поток) после колбека "OnInit" - значит ли это , что, если в скрипте не будет прописан колбек OnInit - то и для функции "main" не будет создан отдельный поток???

--------------------
этот, как и предыдущий вопрос относится не только к Михаилу, но и к другим разработчикам.
Нет не значит.
И как-то комментировать то что сказано на других форумах считаем излишним.
Страницы: 1 2 След.
Читают тему
Наверх