Синхронизация данных от SetUpdateCallback

Страницы: 1
RSS
Синхронизация данных от SetUpdateCallback
 
Добрый день!
Следующая ситуация: я получаю данные через SetUpdateCallback(function(index) cb(index,v.idx, v.classcode,k) end), там два инструмента. Данные приходят с разными задержками (в смысле срабатывания котировок). Это приводит к тому, что определенный кусок кода в функции cb (index,v.idx, v.classcode,k) у меня не исполняется, т к новые данные уже успели изменить значения переменных, но сама ф-я до конца не исполнилась. Наверняка есть локеры, которые не позволяют срабатывать коллбэку, пока не обработались старые значения. Наверное это не слишком оптимально, с точки зрения быстродействия, но в моем случае это не критично...
Спасибо.
ЗЫ заранее прошу прощения, если эта тема уже обсуждалась, т к проблема актуальная. но я не нашел.
 
Из рассказа не очень понятна проблема.
из понятого, попробуйте использовать Coroutines
 
Попробую еще раз) Очередной вызов коллбэка происходит тогда,  когда еще не закончились обрабатываться предыдущие данные, которые его вызвали. как с этим бороться?
 
Цитата
Очередной вызов коллбэка происходит тогда,  когда еще не закончились обрабатываться предыдущие данные, которые его вызвали.
Это неправда.
Один коллбэк работает от начала и до конца.
И только после этого может быть вызван повторно.
 
swerg,
так как текст программы не приведен, то Ваше замечание тоже не верно.
Например, если обработка данных от колбека делается в main.
Тогда очередной вызов колбека может изменить данные в таблице,
через которую они передаются  в функцию в майн.
Т е теоретически указанная выше ситуация возможна.
Но, повторюсь, из приведенного рассказа автора это явно не следует.
 
Суть такова: из main дергаются данные по доллару и евро, коллбэк cb их обрабатывает.
как только пришла новая свеча (1 час масштаб), я выравниваю время в коллбеке по доллару и евро, чтобы он не перерасчитывался многократно полностью. Для этого стоит условие на проверку выравнивания времени (предыдущее время сравнивается с текущим).
Однако, как только время по обоим инструментам выравнивается, кусок кода, который стоит после условных блоков с обработкой данных от инструментов, не исполняется, т к уже срабатывает return, стоящий в начале коллбэка. Т. е. получается ситуация, что время выравнялось, но код до конца не успел исполниться, т к произошел новый вызов, который делает выход из коллбека до того, как успел отработать последний кусок кода.

function main()
  ............
   local i = 1
   for k,v in pairs(shares) do
      ds[i],er= CreateDataSource(v.classcode,k, INTERVAL_H1)
      v.idx = i
      if er==nil then
         ds[i]:SetUpdateCallback(function(index) cb(index,v.idx, v.classcode,k) end)
         toLog(log,"ds added i="..i.." classcode:"..v.classcode.." seccode:"..k)
         i=i+1
      end
      if er~=nil then
         Log(log,"er="..er)
      end
   end

   while is_run do
       sleep(1000)
   end

..................
end



function cb( index , ds_index, classcode, seccode)

   local t = ds[ds_index]:T(index-1)
   local h = t.hour
   local curhms = h*100

   if (curhms==oldt_si and curhms==oldt_eu ) then return end

   if (ds_index==1 and curhms~=oldt_eu) then
           oldt_eu=curhms
...........................
    end

   if (ds_index==2 and curhms~=oldt_si) then
           oldt_si=curhms
...........................
    end
--этот кусок кода не исполняется
if (curhms==oldt_si and curhms==oldt_eu and data.eq==0 and GetEquity==true) then
      ..............
       
   end

end
   
 
можно сделать очередь
либо использовать кораунды
а еще лучше переделать весь алгоритм
 
Скорее всего просто код в функции cb() написан неверно.
 
поставьте выравнивание после обработки.
 
либо введите флаг . И по нему блокируйте обработку.
 
примерно так:
Скрытый текст
 
Максим,
Цитата
--этот кусок кода не исполняется
if (curhms==oldt_si and curhms==oldt_eu and data.eq==0 and GetEquity==true) then
Подозреваю, что ошибка в выделенной части. Т.к. условие curhms==oldt_si and curhms==oldt_eu выполнится только при равенстве трёх переменных curhms, oldt_si, oldt_eu. Это ли имелось ввиду?
Кроме того, строка кода выше
Цитата
if (curhms==oldt_si and curhms==oldt_eu ) then return end
просто выходит из функции. Получается код, который не выполняется, действительно недостижим, т.к. приведённые условия совпадают.
Страницы: 1
Читают тему
Наверх