Поместить колбек в dll

Страницы: 1
RSS
Поместить колбек в dll
 
Как делать простые вещи с dll вроде разобрался.
Прошу проконсультировать, как поместить в dll колбек OnQuote
Чтобы это выглядело как то так:
package.cpath = "C:\\runfast.dll"
require "runfast"
runfast.OnQuote()
...
и так далее.
Ума не приложу где мне эту строчку runfast.OnQuote()  размещать. За пределами main как и сейчас?
подскажите пожалуйста
 
OnQuote()
   runfast.OnQuote()
end
 
Цитата
Алексей написал:
OnQuote()
   runfast.OnQuote()
end
Спасибо за ответ, но этот вариант не подходит. При каждом срабатывании колбека скрипт будет обращаться к dll. Луа в КВИК встроена настолько кривобоко, что это получается долго.
Луа:
Код
   for i=1,10000000 do     
          r = i+i
   end
Луа+dll на Си++
Код
   for i=1,iterations do
      r = runfast.AddTwoNumbers(i, i)   
  end
Второй код работает в 3,6 раза медленнее, чем первый из-за постоянного перекидывания данных из Луа в Си.
Ваш вариант предусматривает те же самые задержки.

Мне нужно колбек OnQuote полностью упаковать внутрь dll. Вызвать его один раз, и потом он крутится только внутри dll
 
примерно как то так. вроде в индексах не ошибся.
Код
static int onQuote(lua_State *L) {
    return 0;
}

extern "C" __declspec(dllexport) int luaopen_runfast(lua_State *L) {
    lua_pushvalue(L, LUA_GLOBALSINDEX); //на стек помещаешь глобальную таблицу
    lua_pushstring(L, "OnQuote"); //дальше строку с ключом таблицы
    lua_pushcfunction(L, onQuote); //дальше свою функцию
    lua_settable(-3); //помещаешь в таблицу по индексу -3, по ключю -2 значение в -1
    lua_remove(-1); //помойму дальше таблица останется на стеке можешь ее почистить.
    return 0;
}
 
Спасибо, сегодня займусь!
Код
static int onQuote(lua_State *L) {

вроде бы тут надо писать с приставкой forLua:
Код
static int forLua_onQuote(lua_State *L) {
.......

И ещё.
У меня extern C встречается два раза. В какое место ставить ваш код?



 
И ещё вопрос.
В луа скрипте что то писать или достаточно require "runfast" (библиотека dll) чтобы OnQuote начал срабатывать?
 
Приставов никаких не нужно. тк в функцию lua_pushcfunction передается  адрес функции. Можете называть ее как угодно(например "asd"). главное  сохранять сигнатуру lua_CFunction = int(lua_state*)
Когда пишете require "runfast" lua вызовет экспортируемую из dll функцию luaopen_runfast. Туда и вставляете код. После LuaL_openlib например(там у вас наверное регистрация доп. функций идет)
 
Цитата
Let_it_go написал:
Цитата
Алексей   написал:
OnQuote()
   runfast.OnQuote()
end
Спасибо за ответ, но этот вариант не подходит. При каждом срабатывании колбека скрипт будет обращаться к dll. Луа в КВИК встроена настолько кривобоко, что это получается долго.
Луа:
Код
      for  i =  1 , 10000000   do      
          r  =  i + i
    end   
Луа+dll на Си++
Код
      for  i =  1 ,iterations  do 
      r  =   runfast.AddTwoNumbers (i, i)   
   end   
Второй код работает в 3,6 раза медленнее, чем первый из-за постоянного перекидывания данных из Луа в Си.
Ваш вариант предусматривает те же самые задержки.

Мне нужно колбек OnQuote полностью упаковать внутрь dll. Вызвать его один раз, и потом он крутится только внутри dll
вообще-то это прикольно.
Вы написали пример из разряда "как не надо писать программы"
В вашем примере операция сложения занимает промерно 1% всего времени
Если вы решили переносить в си
то очевидно что надо переносить весь цикл
в си вместо сложения использовать сдвиг
тогда и будет быстрее.
---------------------------------------
Что же касается вызов колбека в СИ то это не очень вам поможет так как это в квике делается достаточно эффективно.
Надо оптимизировать обработку стакана, так как это работа с таблицами поиском в них заменой и уделением И вот там Вы можете существенно ускорить.
-----------------------
 
 
Николай Камынин,
Цитата
в си вместо сложения использовать сдвиг
что это значит?
 
Николай Камынин,
Цитата
вообще-то это прикольно.
Вы написали пример из разряда "как не надо писать программы"
В вашем примере операция сложения занимает промерно 1% всего времени
мы этот пример обсуждали здесь.
https://forum.quik.ru/forum10/topic3896/

Enfernuz написал, что дело в том, как Lua внедрена в КВИК. LuaJIT это сделал бы намного быстрее
Страницы: 1
Читают тему
Наверх