SetUpdateCallback и обнудение стека Lua

Страницы: 1
RSS
SetUpdateCallback и обнудение стека Lua
 
Здравствуйте,

Слезно прошу помощи, я что то не вьезжаю, что происходит. Раньше вроде все работало, сейчас, как будто бы перестало.

Использую LUA C API - для вызова SetUpdateCallback, вот такой просто С++ код:  да понимаю, что вероятность, что кто-то будет смтреть код стремится к нулю, поэтому срезюмирую поведение кода:

С помощью QLua C API:

-1:Я вызываю CreteDataSorce: вызов происходит успешно, мне возвращается таблица и нулевая ошибка.
-2:Я подтверждаю это проверкой стека Lua: на вершине стека находится таблица и нулевая ошибка.


-3:Затем я вызываю SetUpdateCallback и передаю вв него саму колбек функцию, которая будет вызыватся при каждой совершенной сделке.  Так же дополнительно я связываю по типу лямбды любое значение, чтбы предать для последующего ивзлечения его в самом колбеке.

-4:Вызыва SetUpdateCallback, убеждаюсь, что вызов SetUpdateCallback прошел успешно и опять проверяю стек на наличие ранее заказанной таблицы CreateDataSource - ОНИ НА МЕСТЕ!
.
-5: И наконец на рынке совершается сделка по заказанному инстурменту и вызывается колбек "my_callback__for__SetUpdateCallback". Все что я делаю в данном примере в этом колбеке это проверяю наличие моей таблицы CrateDataSourc в стеке Lua. ИИИИИИ ее там нет!!!! Весь стека кромер первого элемента был "кем-то" очищен!

ВОПРОС: КТО И ЗАЧЕМ очитстил стек ?? КАК видно из кода, между вызовов SetUpdateCallback и вызовом самой колбек-функции нет ни одной строчки кода, которая бы редактировала стек. Так что происходит тогда ?


Код
lua_State* L_global;
int static nummer_table_from_stack;

Код
void SetUpdateCallcak_wrapper(lua_State* L)
{

    L_global = L;
    std::cout << "L_global_adress:" << &L_global << std::endl;


    //-----------------------------------------------------------------1-Вызовем функцию CreateDataSource:Начало--------------------------------------------
    lua_getglobal(L, "CreateDataSource");                 

    lua_pushstring(L, "TQBR");       //Добавим первый параметр функции CreateDataSource на вершину стека
    lua_pushstring(L, "SBER");          //Добавим второй параметр функции CreateDataSource на вершину стека
    lua_pushnumber(L, 1);            //Добавим третий параметр функции CreateDataSource на вершину стека

    int status_lua_pcall = lua_pcall(L, 3, 2, 0);    //Так как все необходимые параметры добавлены в стек, то вызываем функцию lua_pcall - которая использя доабвенные параметры в правильном порядке - реализует вызов функции CreateDataSource: 2-ой параметр - это число аргументов, которые мы добаили в стек и которая принимает функция CreateDataSource; 2-ой: параметр - это число параметров, которое возвращает функция CreateDataSource. После успешного выполнения lua_pcall удаляет и значение функции и переданные аргменты со стека в кол-во указанном во втором параметре(не велючая функцию) и доабвляеи результат на стек в кол-во указанном во втором параметре.
    //-----------------------------------------------------------------1-Вызовем функцию CreateDataSource:Конец--------------------------------------------



    //-------------------------------------------------------------------5-Проверка на ошибку lua_pcall:Начало---------------------------------------------------------------------
    if (status_lua_pcall != 0)
    {
        //Ошибка произошла при вызове функции lua_pcall при вызове CreateDataSource:
        std::cout << "ERROR CreateDataSource" << std::endl;
        return;
    }
    //-------------------------------------------------------------------5-Проверка на ошибку lua_pcall:Конец---------------------------------------------------------------------
    else
    {

         nummer_table_from_stack = lua_gettop(L) - 1;   //Это номер элемента в стеке L - в котором теперь размещается полученная от CreateDataSource таблица. "-1" - потому что CreateDataSource поместила на вершину стека две перменные: таблицу и переменную об ошибке. То есть таблица находить на предпоследнем месте с вершины стека.

         my_call_SetUpdateCallback(L);     //Вызываем SetUpdateCallback wrapper
    }

}

Код
static void ckeck_Lua_Stack(lua_State* L)
{

    std::cout << "----------------------------------------" << std::endl;

    int top = lua_gettop(L);
    std::cout << "Total element is stack:"<< top << std::endl;

    for (int i = 1; i <= top; i++) 
    {
        int type = lua_type(L, i);

        const char* type_name = lua_typename(L, type);

        std::cout << "type:" << type_name << ":";


        if (type == LUA_TSTRING || type == LUA_TNUMBER) 
        {
            std::cout << lua_tostring(L, i) << std::endl;
        }
        else
        {
            std::cout << std::endl;
        }
    }
    std::cout << "----------------------------------------" << std::endl << std::endl;


    //std::this_thread::sleep_for(std::chrono::milliseconds(100000));

}
Код
static int my_callback__for__SetUpdateCallback(lua_State* L)
{

//Значит произошла сделка!

    std::cout << "Number_candle:"<< lua_tonumber(L, -1) << std::endl;

    ckeck_Lua_Stack(L_global);         //Проверяем стек Lua!!! И теперь в нем находится сдедующее:

----------------------------------------
Total element is stack:1                          //Куда черт возьми делать моя ранее заказанная таблица CreateDataSource ?????
type:number:1
----------------------------------------


    return 0;

}

Код
static void my_call_SetUpdateCallback(lua_State* L)
{

    
    //--------------------------------------------------------
    lua_getfield(L_global, nummer_table_from_stack, "SetUpdateCallback");                       //"Извлекаем" из "таблицы" функцию SetUpdateCallback.
     
    lua_pushvalue(L_global, nummer_table_from_stack);                                                       //Помещаем копию обьекта таблицы CreateDataSource на вершину стека.
    //--------------------------------------------------------


    lua_pushnumber(L_global, 555);  //Просто для примера связываю какое то любое значение для передачи в колбек. 

    lua_pushcclosure(L_global, my_callback__for__SetUpdateCallback, 1);       //Захватываем.


    //--------------------------------------------------------
    int status_lua_pcall = lua_pcall(L_global, 2, 0, 0);                  //Реализауем вызов функции SetUpdateCallback с аргументом таблицы, которую поместили на вершину стека 
    //--------------------------------------------------------
    

    if (status_lua_pcall != 0)
    {
        std::cout << "lua_pcall__ERROR" << std::endl;
        return; 
    }
    else
    {
        std::cout << "SetUpdateCallback Success Call" << std::endl;
        
        ckeck_Lua_Stack(L_global);       //Проверяю что находится на данный момент в стеке Lua.

       //Находится следующее:

 ----------------------------------------
Total element is stack:3
type:string:1     //Таблица глобьальный функций
type:table:        //Это как раз запрошенная таблица CreateDataSource
type:nil:            //Ошибка при запросе таблицы CreateDataSource - то есть nil - ошибки нет.
----------------------------------------

        return;
    }


}
 
все верно, в стеке ее нет, так как колбек вызывает QUIK .
А в момент вызова в стеке может быть все что угодно - т е то что делает VMLua в данный момент.
При выходе из функции стек всегда очищается.
Надо иначе передавать таблицу.
 
 
Я не использую API C для подписке на источник данных и делаю это на луа.
Это проще. А так как подписка один раз то и смысла нет использовать С.
 
Цитата
nikolz написал:
все верно, в стеке ее нет, так как колбек вызывает QUIK .
А в момент вызова в стеке может быть все что угодно - т е то что делает VMLua в данный момент.
При выходе из функции стек всегда очищается.
Надо иначе передавать таблицу.
А как тогда можно передать таблицу ? Я же не могу ее куда то скопировать. Я должен же работать со стеком Lua, причем с тем стеком, который первоначально создал Quik.
 
Цитата
Quikos_1 написал:
Цитата
nikolz написал:
все верно, в стеке ее нет, так как колбек вызывает QUIK .
А в момент вызова в стеке может быть все что угодно - т е то что делает VMLua в данный момент.
При выходе из функции стек всегда очищается.
Надо иначе передавать таблицу.
А как тогда можно передать таблицу ? Я же не могу ее куда то скопировать. Я должен же работать со стеком Lua, причем с тем стеком, который первоначально создал Quik.
Я покажу Вам фрагмент моего скрипта. Подробно объяснять лень.
Но из собственного опыта могу сказать что для тиков это плохая затея. Тормоз ужасный. Кроме того тиков есть уже колбек OnAllTrade и лучше него вы не сделаете.
У меня есть различные варианты, вот один из фрагментов:
Код
while d==nil and k>0 do d,err=CreateDataSource(clas,sec,m); sleep(1); k=k-1; end
    if d then  --d[1]=sec; d[2]=clas; d[3]=ts; d[3]=tc; d[4]=m; d[1]
   --   if m>0 then  d:SetUpdateCallback(function(index) cbCandle(index,d);end);
--   else
   d[1]=0;      d:SetEmptyCallback() ;
--   end
   ds[j]=d;
   end
      ds[0]=j;
 
 
Цитата
nikolz написал:
Цитата
Quikos_1 написал:
 
Цитата
nikolz  написал:
все верно, в стеке ее нет, так как колбек вызывает QUIK .
А в момент вызова в стеке может быть все что угодно - т е то что делает VMLua в данный момент.
При выходе из функции стек всегда очищается.
Надо иначе передавать таблицу.
 А как тогда можно передать таблицу ? Я же не могу ее куда то скопировать. Я должен же работать со стеком Lua, причем с тем стеком, который первоначально создал Quik.
Я покажу Вам фрагмент моего скрипта. Подробно объяснять лень.
Но из собственного опыта могу сказать что для тиков это плохая затея. Тормоз ужасный. Кроме того тиков есть уже колбек OnAllTrade и лучше него вы не сделаете.
У меня есть различные варианты, вот один из фрагментов:
Код
   while  d =  =  nil   and  k >  0   do  d,err =  CreateDataSource (clas,sec,m);  sleep ( 1 ); k = k -  1 ;  end 
     if  d  then    --d[1]=sec; d[2]=clas; d[3]=ts; d[3]=tc; d[4]=m; d[1] 
    --   if m>0 then  d:SetUpdateCallback(function(index) cbCandle(index,d);end); 
 --   else 
   d[ 1 ] =  0 ;      d: SetEmptyCallback () ;
 --   end 
   ds[j] = d;
    end 
      ds[ 0 ] = j;
  
 
Спасибо. Но вы используете обычный Lua, с обычным Lua проблем то нет. Проблемы именно с LUA C API.
 
Я точно знаю, что у меня работало. Может это быть из за перехода от USB-ключа, к двухфакторной аутентификации по смс и паролю ?? Я не вижу никаких других причин.
Я тупо не понимаю че происходит, потому что у меня 100% работало.
 
Цитата
Quikos_1 написал:
ВОПРОС: КТО И ЗАЧЕМ очитстил стек ?? КАК видно из кода, между вызовов SetUpdateCallback и вызовом самой колбек-функции нет ни одной строчки кода, которая бы редактировала стек. Так что происходит тогда ?
  1. На форуме много раз отмечалось, что если нужен результат, а не развлечение отладкой, то писать скрипты надо просто. Что-то использовать кроме QLua, надо в крайнем случае (в том числе C-API), если, действительно, QLua и многочисленных пакетов Lua не хватает для реализации задуманного.
  2. Зачем вы используете C-AP?  Что вам не хватает в Qlua?
  3. В Qlua, как известно, автоматическая память и сборка мусора может быть запущена как внутри вызова C-API, так и при вызове коллбека, в основном отдельном параллельном потоке QUIK. Мусорщик работает по всем таблицам и стекам lua_State и что-то там делает.
 
Цитата
TGB написал:
Цитата
Quikos_1 написал:
ВОПРОС: КТО И ЗАЧЕМ очитстил стек ?? КАК видно из кода, между вызовов SetUpdateCallback и вызовом самой колбек-функции нет ни одной строчки кода, которая бы редактировала стек. Так что происходит тогда ?
   1. На форуме много раз отмечалось, что если нужен результат, а не развлечение отладкой, то писать скрипты надо просто. Что-то использовать кроме QLua, надо в крайнем случае (в том числе C-API), если, действительно, QLua и многочисленных пакетов Lua не хватает для реализации задуманного.
  2. Зачем вы используете C-AP?  Что вам не хватает в Qlua?
  3. В Qlua, как известно, автоматическая память и сборка мусора может быть запущена как внутри вызова C-API, так и при вызове коллбека, в основном отдельном параллельном потоке QUIK. Мусорщик работает по всем таблицам и стекам lua_State и что-то там делает.
Зачем вы спрашиваете почему я использую Lua C API и зачем пишите про сборщик мусора ?? Как это все отвечает на мой вопрос или проблему ?
 
Цитата
TGB написал:
Цитата
Quikos_1 написал:
ВОПРОС: КТО И ЗАЧЕМ очитстил стек ?? КАК видно из кода, между вызовов SetUpdateCallback и вызовом самой колбек-функции нет ни одной строчки кода, которая бы редактировала стек. Так что происходит тогда ?
   1. На форуме много раз отмечалось, что если нужен результат, а не развлечение отладкой, то писать скрипты надо просто. Что-то использовать кроме QLua, надо в крайнем случае (в том числе C-API), если, действительно, QLua и многочисленных пакетов Lua не хватает для реализации задуманного.
  2. Зачем вы используете C-AP?  Что вам не хватает в Qlua?
  3. В Qlua, как известно, автоматическая память и сборка мусора может быть запущена как внутри вызова C-API, так и при вызове коллбека, в основном отдельном параллельном потоке QUIK. Мусорщик работает по всем таблицам и стекам lua_State и что-то там делает.
Для примера: обычным скриптом вы не можете вызвать SetUpdateCallback - ЕСЛИ у вас не открыт график.
Соответсвенно если вы хотите вызвать SetUpdateCallback для одного и того же инструмента но с разными временными интервалами, вам нужно их открыть на графике.
Соответвенно, если выхотите ообратится к индикаторам - васм ОПЯТЬ нужно настроить их на графике. Это просто знатная  *  вам скажу.
 
1.   Это ваш вопрос?:
Цитата
Quikos_1 написал:
ВОПРОС: КТО И ЗАЧЕМ очитстил стек ??
 Это мой ответ:
Цитата
TGB написал:
Мусорщик работает по всем таблицам и стекам lua_State и что-то там делает.

2. Для меня некоторое открытие  :smile: , что в QLua:
Цитата
Quikos_1 написал:
вы не можете вызвать SetUpdateCallback - ЕСЛИ у вас не открыт график.
 
Цитата
TGB написал:
1.   Это ваш вопрос?:
Цитата
Quikos_1 написал:
ВОПРОС: КТО И ЗАЧЕМ очитстил стек ??
  Это мой ответ:
Цитата
TGB написал:
Мусорщик работает по всем таблицам и стекам lua_State и что-то там делает.
Ох, Вы явно путаете сборку мусора оперативной памяти и рабочую структура стека Lua. Они ни как не связаны.



Цитата

2. Для меня некоторое открытие  :: , что в QLua:
Цитата
Quikos_1 написал:
вы не можете вызвать SetUpdateCallback - ЕСЛИ у вас не открыт график.


Видимо Вы просто не разу не пытались заказывать данные по инстурменту, который у Вас не открыт в Квике.
 
[
Цитата
Quikos_1 написал:
Ох, Вы явно путаете сборку мусора оперативной памяти и рабочую структура стека Lua. Они ни как не связаны.
  Это без комментария :smile:

Цитата
Quikos_1 написал:
Видимо Вы просто не разу не пытались заказывать данные по инстурменту, который у Вас не открыт в Квике
  Интересно,  как вы открываете с помощью C-API "данные по инстурменту, который у Вас не открыт в Квике"?
 
Цитата
TGB написал:
[
Цитата
Quikos_1 написал:
Ох, Вы явно путаете сборку мусора оперативной памяти и рабочую структура стека Lua. Они ни как не связаны.
   Это без комментария ::

Так эту глупость про сборщик мусора вообще Вам не нужно было писать - дичь конечно эпичная :)
 
Цитата
TGB написал:
[
Цитата
Quikos_1 написал:
Видимо Вы просто не разу не пытались заказывать данные по инстурменту, который у Вас не открыт в Квике
   Интересно,  как вы открываете с помощью C-API "данные по инстурменту, который у Вас не открыт в Квике"?

Только не открываю,а "заказываю". Просто указывая класс инструмента, имя и интервал.
 
Цитата
Quikos_1 написал:

Видимо Вы просто не разу не пытались заказывать данные по инстурменту, который у Вас не открыт в Квике.
Нормальный терминал - это тот, где нет ни одного графика, может только таблицы, для оценки взглядом цифр. Все делает сам скрипт. Так что это нормальная практика - заказать данные, рассчитать все данные, принять решения.
SetUpdateCallback - очень неудобный колбек с точки зрения использования.

Во-первых, он вызывается на каждое изменение цены, даже внутри одного и того же бара. Если это необходимо отслеживать, то есть более удобные способы.
А если не надо, то проще самому обрабатывать данные, реагировать только если Size потока изменился.
Во-вторых, после заказа данных, он будет вызван для всех баров, начиная от 1. И опять - это проще сделать самому, перебрав данные в цикле.
Ну и, наконец, - он медленный.

Впрочем, дело вкуса, конечно.
 
Цитата
Quikos_1 написал:
Только не открываю,а "заказываю". Просто указывая класс инструмента, имя и интервал.
    И это нельзя сделать в тексте скрипта с помощью CreateDataSource :smile: ?
 
Цитата
Nikolay написал:
Цитата
Quikos_1 написал:

Видимо Вы просто не разу не пытались заказывать данные по инстурменту, который у Вас не открыт в Квике.
Нормальный терминал - это тот, где нет ни одного графика, может только таблицы, для оценки взглядом цифр. Все делает сам скрипт. Так что это нормальная практика - заказать данные, рассчитать все данные, принять решения.
SetUpdateCallback - очень неудобный колбек с точки зрения использования.

Во-первых, он вызывается на каждое изменение цены, даже внутри одного и того же бара. Если это необходимо отслеживать, то есть более удобные способы.
А если не надо, то проще самому обрабатывать данные, реагировать только если Size потока изменился.
Во-вторых, после заказа данных, он будет вызван для всех баров, начиная от 1. И опять - это проще сделать самому, перебрав данные в цикле.
Ну и, наконец, - он медленный.

Впрочем, дело вкуса, конечно.
SetUpdateCallback - вполне себе удобный, только перестал работать для Си.

Про тот способ, который вы пишите про отличный от ""SetUpdateCallback" - нужно самому формировать интервалы из тиков, я побывал, но в итоге отказался от этого.
Насчет того, что он будет вызван для всех исторических баров - это тоже не проблема, я просто пропускаю все исторические бары и смотрю только с того вызова колбека, который идет уже после последнего исторического бара.

Тут проблем нет - это все работало, это все уже было написано на С++. Но это просто перестало работать из за описанной мной проблемы. :(
 
Цитата
TGB написал:
Цитата
Quikos_1 написал:
Только не открываю,а "заказываю". Просто указывая класс инструмента, имя и интервал.
     И это нельзя сделать в тексте скрипта с помощью CreateDataSource :: ?
Для индикаторов - однозначно Нет.
 
Цитата
Quikos_1 написал:
Так эту глупость про сборщик мусора вообще Вам не нужно было писать - дичь конечно эпичная :)
   Поделитесь, пожалуйста, с форумом вашими, интересными знаниями о сборке мусора в QLua. Очень любопытно :smile:
 
Цитата
Quikos_1 написал:
Для индикаторов - однозначно Нет.
 Вопрос задан: как это вы делаете с помощью C-API?
 
Цитата
TGB написал:
Цитата
Quikos_1 написал:
Для индикаторов - однозначно Нет.
  Вопрос задан: как это вы делаете с помощью C-API?
У меня есть готовые функции на С++ которые быстро высчитывают нужные мне индикаторы. На Lua я конечно этого делать точно не собираюсь.
 
Цитата
TGB написал:
Цитата
Quikos_1 написал:
Так эту глупость про сборщик мусора вообще Вам не нужно было писать - дичь конечно эпичная :)
    Поделитесь, пожалуйста, с форумом вашими, интересными знаниями о сборке мусора в QLua. Очень любопытно ::
Что бы хотели знать ?
 
Цитата
Quikos_1 написал:
Что бы хотели знать ?
   В каких местах исходников Lua (файл/строка), вызывается мусорщик?
 
Цитата
TGB написал:
Цитата
Quikos_1 написал:
Что бы хотели знать ?
    В каких местах исходников Lua (файл/строка), вызывается мусорщик?
А Вы сами найти не в состоянии ?
 
А что вы спрашиваете :smile: ?:
Цитата
Quikos_1 написал:
ВОПРОС: КТО И ЗАЧЕМ очитстил стек ?? КАК видно из кода, между вызовов SetUpdateCallback и вызовом самой колбек-функции нет ни одной строчки кода, которая бы редактировала стек. Так что происходит тогда ?
  Сами найти не можете?
 
Цитата
TGB написал:
А что вы спрашиваете :: ?:
Цитата
Quikos_1 написал:
ВОПРОС: КТО И ЗАЧЕМ очитстил стек ?? КАК видно из кода, между вызовов SetUpdateCallback и вызовом самой колбек-функции нет ни одной строчки кода, которая бы редактировала стек. Так что происходит тогда ?
   Сами найти не можете?
Вы уже задали достаточно вопросов, но не ответили не на один мой. Это так не работает, если только Вы монолог сами с собой не ведете.
Давайте еще раз: А Вы сами найти не в состоянии ?
 
Цитата
Quikos_1 написал:
Это так не работает, если только Вы монолог сами с собой не ведете.
 Учел вашу критику :smile: .

1.
Цитата
Quikos_1 написал:
Ох, Вы явно путаете сборку мусора оперативной памяти и рабочую структура стека Lua. Они ни как не связаны.
         Сначала некоторое утверждение, а затем конкретный вопрос:  
   1) При уборке мусора просматриваются объекты скрипта  и ищутся такие, на которые нет ссылок из среды выполнения скрипта.
   2) Если в стеке скрипта, в момент работы мусорщика, находится ссылка на какую то таблицу и на нее нет других ссылок, то как мусорщик определит, что эта таблица «живая», не обрабатывая стек?

2. Мне стало интересно посмотреть такой  
Цитата
Quikos_1 написал:
просто С++ код
:
    1) Ошибка:
        Оператор  if (status_lua_pcall != 0) ловит только исключения.
        Функция . CreateDataSource обычно завершается, не выбрасывая исключение, даже если источник не создан.
        Надо анализировать результат выполнения CreateDataSource.
        Если источник не создан, то первое значение результата nil, а второй результат: строка описания ошибки создания источника.
        Похоже, вы запускаете свой скрипт в песочнице, а там класс для SBER не TQBR. У вас не создался источник свечей.

   Далее мне смотреть не интересно.
 
Цитата
TGB написал:
Цитата
Quikos_1 написал:
Это так не работает, если только Вы монолог сами с собой не ведете.
  Учел вашу критику :: .

1.  
Цитата
Quikos_1 написал:
Ох, Вы явно путаете сборку мусора оперативной памяти и рабочую структура стека Lua. Они ни как не связаны.
          Сначала некоторое утверждение, а затем конкретный вопрос:  
   1) При уборке мусора просматриваются объекты скрипта  и ищутся такие, на которые нет ссылок из среды выполнения скрипта.
   2) Если в стеке скрипта, в момент работы мусорщика, находится ссылка на какую то таблицу и на нее нет других ссылок, то как мусорщик определит, что эта таблица «живая», не обрабатывая стек?
Я знаю это и поэтому и написал про глупость о сборщике мусора, который удаляет мою Рабочую таблицу из стека.
Это рабочая таблица и они используется из колбекка, который указывается при вызове SetUpdateCallback - так что сборщик ни как может и не должен ее удалять. Неужели это не понятно.
 
Цитата
TGB написал:
 1) Ошибка:         Оператор  if (status_lua_pcall != 0) ловит только исключения.        
Функция . CreateDataSource обычно завершается, не выбрасывая исключение, даже если источник не создан.        
Надо анализировать результат выполнения CreateDataSource.        
Если источник не создан, то первое значение результата nil, а второй результат: строка описания ошибки создания источника.          
Похоже, вы запускаете свой скрипт в песочнице, а там класс для SBER не TQBR. У вас не создался источник свечей.    Далее мне смотреть не интересно.
Вы Невнимательны. И из за своего не внимания выделаете вывод, как будто бы это факт.

Посмотрите код из функции my_call_SetUpdateCallback, где я четко написал:

Код
  ckeck_Lua_Stack(L_global);       
//Проверяю что находится на данный момент в стеке Lua.        
 //Находится следующее: 
---------------------------------------- 
Total element is stack:3 
type:string:1     //Таблица глобальных функций 
type:table:      //Это как раз запрошенная таблица CreateDataSource 
type:nil:        //Ошибка при запросе таблицы CreateDataSource - то есть nil - ошибки нет.
----------------------------------------
И тогда не придется фантазировать на тему "Надо анализировать результат выполнения CreateDataSource."
 
Цитата
TGB написал:

    1) Ошибка:
        Оператор  if (status_lua_pcall != 0) ловит только исключения.
        Функция . CreateDataSource обычно завершается, не выбрасывая исключение, даже если источник не создан.
        Надо анализировать результат выполнения CreateDataSource.
        Если источник не создан, то первое значение результата nil, а второй результат: строка описания ошибки создания источника.
        Похоже, вы запускаете свой скрипт в песочнице, а там класс для SBER не TQBR. У вас не создался источник свечей.

   Далее мне смотреть не интересно.
Более того, вы не внимательны вдвойне - я четко написал, что колбек установленный при вызове SetUpdateCallback вызывается, а значит никаких ошибок при вызове CreateDataSiurce быть не может.
Слишком уж вы не внимательны.
 
Цитата
Quikos_1 написал:
type:string:1     //Таблица глобальных функций
  Ну, если это таблица, то я сдаюсь и "умываю руки" :smile: .  Похоже, вы долго будете развлекаться отладкой. Потом, просьба к вам, сообщить конечный результат в этой ветке.
 
Цитата
TGB написал:
Цитата
Quikos_1 написал:
type:string:1     //Таблица глобальных функций
   Ну, если это таблица, то я сдаюсь и "умываю руки" :: .  Похоже, вы долго будете развлекаться отладкой. Потом, просьба к вам, сообщить конечный результат в этой ветке.
Я некорректно написал - это строка которая помещается после вызова luaL_newlib(L, ls_lib); и до вызова функции "server_run", Вообщем не имеет значение что это. Оно всегда там находится внизу стек.
Где таблица от CreateDataSource я указал.

Ну а вместе с руками и лицо можно "умыть" - так чтобы освежится и быть более внимательным.
Конечного результата походу не будет, потому что это просто не работает, а тех поддержка не отвечает.
 
Вопрос отменяется. Нашел проблему.
Страницы: 1
Читают тему
Наверх