1 (2022-10-20 12:24:28 отредактировано Serg_)

Тема: Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы

После вызова callback`а от SetUpdateCallback - я сразу отписываюсь от callback`а, но отписываюсь именно от как бы первого объекта CreateDataSource, но почему от отписка происходит от всех последующих от CreateDataSource.



Вот такой простенький код:



function my_callback_CreateDataSource_HISTORY(my_table_data_history_candle_, code_class, code_paper, interval)

message("SIZE_TABLE:" ..tostring(my_table_data_history_candle_:Size()) )

my_table_data_history_candle_:Close()     --отписываемся от callback`а. Нужен только первый вызов.

end


function my_callback_CreateDataSource_HISTORY_1(my_table_data_history_candle_, code_class, code_paper, interval)

message("SIZE_TABLE:" ..tostring(my_table_data_history_candle_:Size()) )

--Этот колбек уже не вызывается.

end






function main()

local code_class_= "TQBR"          
local code_paper_= "ZVEZ"           
local interval_= INTERVAL_W1

my_table_, error_desc = CreateDataSource(code_class_, code_paper_, interval_)  

------------------------Проверка на ошибки:-------------------
if error_desc ~= nil then 
message(error_desc)
end
--------------------------------------------------------------

my_table_:SetUpdateCallback(function(idx)my_callback_CreateDataSource_HISTORY(my_table_, code_class_, code_paper_, intervakla_) end)




code_class_= "TQBR"          
code_paper_= "ZVEZ"           
interval_= INTERVAL_M15   


my_table_1, error_desc_1 = CreateDataSource(code_class_, code_paper_, interval_) 

------------------------Проверка на ошибки:-------------------
if error_desc_1 ~= nil then 
message(error_desc_1)
end
--------------------------------------------------------------

my_table_1:SetUpdateCallback(function(idx)my_callback_CreateDataSource_HISTORY_1(my_table_1, code_class_, code_paper_, intervakla_) end)



-------------------------
while not stopped do 
sleep(1)
end 
-------------------------


end -- end main()

То есть я вызываю CreateDataSource для двух значений, которые точно нужно заказывать на сервере.

На два значений вешаю callback`и.

Вызывается первый callback для my_table_ и сразу же отписываюсь от callback`а - НО отписка осуществляется и для таблицы my_table_1, то есть отписка осуществляется для всех ранее заказанных callback`ов для разных парамтеров.

Так и должно быть ?

2

Re: Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы

Все таки хотелось возвратится к данному вопросу.
Это нормально, что всего один вызов Close у объекта CreateDataSource - отменяет все заказы SetUpdateCallback у других объектов CreateDataSource ?

3 (2022-10-20 12:02:42 отредактировано swerg)

Re: Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы

Предлагаю обсуждать эту общую проблему на примере Lua-кода, демонстрирующего такую же проблему.
Если у вас есть Lua-код, где происходит тоже самое - приведите его. Возможно окажется, что это просто ошибка терминала.

Объясню. Возможны два варианта:
1) Ошибка в Lua API терминала
2) Ошибка в переложении кода Lua на С++.

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

Копаться в С++ коде, тем более в котором вы весьма творчески используете вызовы Lua-API - слишком бесперспективное занятие.
При этом вашу идею, которую вы хотите реализовать, на основании этого С++ кода я лично никак не могу понять. Смотрел тему уже несколько раз, но увы. Потому и ответов нет.

4

Re: Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы

swerg пишет:

Предлагаю обсуждать эту общую проблему на примере Lua-кода, демонстрирующего такую же проблему.
Если у вас есть Lua-код, где происходит тоже самое - приведите его. Возможно окажется, что это просто ошибка терминала.
.

Этот код в самом пером сообщении. Это чисто Lua код - без с++.

5

Re: Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы

swerg пишет:

При этом вашу идею, которую вы хотите реализовать, на основании этого С++ кода я лично никак не могу понять. Смотрел тему уже несколько раз, но увы. Потому и ответов нет.

Разве там есть С++ код ? smile

6

Re: Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы

Сорри, что-то я уже совсем специфически всё читаю smile

7 (2022-10-20 12:41:01 отредактировано swerg)

Re: Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы

Serg_ пишет:

НО отписка осуществляется и для таблицы my_table_1

А как вы это определили?
А если убрать вызовы :close из callbac'ов - точно оба callbac'а будут вызываться? (возможно много раз, но главное оба или нет)

Практического смысла задачи я не понимаю совсем.
Получить параметры одной единственной какой-то самой старой свечи - и все? зачем?

8

Re: Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы

swerg пишет:
Serg_ пишет:

НО отписка осуществляется и для таблицы my_table_1

А как вы это определили?
А если убрать вызовы :close из callbac'ов - точно оба callbac'а будут вызываться? (возможно много раз, но главное оба или нет)

Практического смысла задачи я не понимаю совсем.
Получить параметры одной единственной какой-то самой старой свечи - и все? зачем?

Если я убираю Close - то вызываются оба callback`а.
Практические применение банальное: предположим я заказал колбеки на изменение цены для 100 акций, и в какой то момент - мне больше не нужно получать изменение цены к примеру по Газпрому. Я вызываю Close для обьекта Газпрома - но происходит отписка и от остальных 99 акций.

9 (2022-10-20 16:18:50 отредактировано swerg)

Re: Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы

Попробуйте сделать отписку за пределами callback'а. Может в этом беда?

И еще.
Перепишете этот тестовый код проще. Вот этот модельный код. Так, чтобы я нем не было вот этих вот замыканий. Просто назначьте нормальную функцию в качестве callback'а. Вам для именно данного эксперимента замыкания совершенно не требуются, можно вызывать :close()  прямо на нужном dataset'е, все равно у вас две разные функции для  callback'ов в данном примере.
Я к тому, что может тут что-то с замыканиями путается не туда.

Еще вариант: в приведенном примере вы подписываетесь на разные интервалы одного инструмента. Может именно в таком стечении обстоятельств в терминале баг? попробуйте сделать подписку на 2 разных инструмента и повторите эксперимент.

10

Re: Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы

swerg пишет:

Я к тому, что может тут что-то с замыканиями путается не туда.

Да, но, как я тогда узнаю, для какого объекта CreateDataSource вызвался колбек, в колбек по умолчанию приходит только номер свечи.

11

Re: Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы

Заработало, видимо действительно было связано с тем, что для одного и того же инструмент хоть и для разных интервалов - вызов Close - отписывает сразу весь инструмент целиков в не зависимости от интервалов.

Но, теперь появилась другая проблема. Если я хочу заказать callback`и по 100 разным акциям - мне, что нужно писать имена для 100 разных callback`ов ? Потому что если указать для всех вызовов SetUpdateCallbackcallback  - одну и туже callback-функцию, то идет "перезапись" акции.

12

Re: Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы

Так когда проблема починилась?
Когда от замыкания отказались или когда на разные инструменты подписка оформлена?

13

Re: Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы

swerg пишет:

Так когда проблема починилась?
Когда от замыкания отказались или когда на разные инструменты подписка оформлена?

Замыкание оставил, когда два разных инструмента заказал с двумя разными колбек-функиями.
Если для двух разных инструментов в  SetUpdateCallbackcallback - указываю одну и ту же callback-функию, она перезаписывает предыдущий заказ.

14 (2022-10-20 20:37:31 отредактировано swerg)

Re: Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы

Serg_ пишет:

Если для двух разных инструментов в  SetUpdateCallbackcallback - указываю одну и ту же callback-функию, она перезаписывает предыдущий заказ.

Как-то сомнительно это звучит. Либо замыкания не замыкания.

Надо воспроизводить, разбираться. Будет как-нибудь время - попробую. Теоретизировать бесполезно.

15

Re: Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы

Все, путем подбора разобрался.
Спасибо!

16

Re: Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы

Так в чем беда-то была?

Одну callback-функцию удается использовать на много заказов?
Отписка все равно происходит по одному инструменту везде, если с разными интервалами его заказывать? или это тоже удалось победить?

17 (2022-10-20 21:45:12 отредактировано Serg_)

Re: Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы

Все удалось победить, вот итоговый код:

----------------------------------------------------------------------------------------------------
function my_callback_CreateDataSource_HISTORY_1(my_table_data_history_candle_, code_class_, code_paper_, interval_, interval_string_)

message("SIZE_TABLE:" ..tostring(my_table_data_history_candle_:Size()) .. "\n" .. ":" ..  code_paper_ ..":" .. interval_string_ ..":" ..my_int_1)

    if code_paper_ == "SBER" then

    message("SBER_CLOSE")
    my_table_data_history_candle_:Close()     --Сразу отпусываемся от callback`а SBER. //callback Газпрома продолжает приходить. 

     end



end
----------------------------------------------------------------------------------------------------





------------------------------------------------int main:---------------------------------------------------

function main()


local code_class_1= "TQBR"          
local code_paper_1= "GAZP"           
local intervakla_1= INTERVAL_MN1
local intervakla_string_1 = "INTERVAL_MN1"



local my_table_1, error_desc_1 = CreateDataSource(code_class_1, code_paper_1, intervakla_1)  


------------------------Проверка на ошибки:-------------------
if error_desc_1 ~= nil then 
message("1:" .. error_desc_1)
end
--------------------------------------------------------------

my_table_1:SetUpdateCallback(function(idx)my_callback_CreateDataSource_HISTORY_1(my_table_1, code_class_1, code_paper_1, intervakla_1, intervakla_string_1) end)






local code_class_1= "TQBR"          
local code_paper_1= "SBER"           
local intervakla_1= INTERVAL_W1
local intervakla_string_1 = "INTERVAL_W1"


local my_table_2, error_desc_2 = CreateDataSource(code_class_1, code_paper_1, intervakla_1) 

------------------------Проверка на ошибки:-------------------
if error_desc_2 ~= nil then 
message("2:" .. error_desc_2)
end
--------------------------------------------------------------


my_table_2:SetUpdateCallback(function(idx)my_callback_CreateDataSource_HISTORY_1(my_table_2, code_class_1, code_paper_1, intervakla_1, intervakla_string_1) end)





-------------------------
while not stopped do 
sleep(1)
end 
-------------------------



end -- end main()