Добрый день! Следующая ситуация: я получаю данные через SetUpdateCallback(function(index) cb(index,v.idx, v.classcode,k) end), там два инструмента. Данные приходят с разными задержками (в смысле срабатывания котировок). Это приводит к тому, что определенный кусок кода в функции cb (index,v.idx, v.classcode,k) у меня не исполняется, т к новые данные уже успели изменить значения переменных, но сама ф-я до конца не исполнилась. Наверняка есть локеры, которые не позволяют срабатывать коллбэку, пока не обработались старые значения. Наверное это не слишком оптимально, с точки зрения быстродействия, но в моем случае это не критично... Спасибо. ЗЫ заранее прошу прощения, если эта тема уже обсуждалась, т к проблема актуальная. но я не нашел.
Попробую еще раз) Очередной вызов коллбэка происходит тогда, когда еще не закончились обрабатываться предыдущие данные, которые его вызвали. как с этим бороться?
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 ..............
--shares -- список инструментов local oldt_si,oldt_eu,flag=0,0,0; local ds={}; function main() local i = 1 for sec,v in pairs(shares) do local t=ds[i] if t==false then t,er= CreateDataSource(v.classcode,sec, INTERVAL_H1) if er==nil then t.clas=v.classcode; t.sec=sec; t:SetUpdateCallback(function(index) cb(index,ds[i]) end) toLog(log,"ds added i="..i.." classcode:"..v.classcode.." seccode:"..sec) ds[i]=t; else Log(log,"er="..er) end end i=i+1 end
while is_run do sleep(1000) end
end
function cb(ind,t) local Ti = t:T(ind-1) local h = Ti.hour local curhms = h*10 if flag==2 and (curhms~=oldt_si or curhms~=oldt_si) then flag=0 end if flag==2 then return end if curhms==oldt_si then flag=flag+1; oldt_si=curhms end if curhms==oldt_eu then flag=flag+1; oldt_eu=curhms end
--этот кусок кода не исполняется 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
просто выходит из функции. Получается код, который не выполняется, действительно недостижим, т.к. приведённые условия совпадают.