CreateDataSource: задержка получения данных

Страницы: 1
RSS
CreateDataSource: задержка получения данных
 
В функции OnInit, чтобы получить несколько свечей истории, выполняется следующий код:

Код
 ds_sr, err = CreateDataSource(class, sr_sec, INTERVAL_H1)
 if not ds_sr then message(err, 1) end

 ds_sp, err = CreateDataSource(class, sp_sec, INTERVAL_H1)
 if not ds_sp then message(err, 1) end

 ds_sr : SetEmptyCallback()
 ds_sp : SetEmptyCallback()

 local i = 0
 while (not(sz_sr and sz_sr and sz_sr > 0 and sz_sp > 0) and i < 30) do
      sleep(1000)
      sz_sr = ds_sr:Size()
      sz_sp = ds_sp:Size()
      i = i + 1
 end
 message("i = "..i, 1)    
 message("sz_sr, sz_sp = "..sz_sr..", "..sz_sp,1)

По непонятной причине правильный размер истории выдается лишь при каждом втором запуске скрипта, а при остальных запусках переменные sz_sr и sz_sp имееют значение 0, несмотря на тридатисекундное ожидание правильного значения. В чем ошибка? Как гарантировать разумный Size при всех запусках?

Благодарю за любую помощь!
 
rpns,
Уберите код из OnInit
Все колбеки выполняются в основном потоке терминала, т.е. пока колбек не завершит работу, терминал будет висеть и ничего не делать.
 
Sergey Gorokhov,  спасибо! В main все работает ожидаемым образом. (Кстати, и без вызова SetEmptyCallback. Зачем он тогда?)

А вот сути проблемы я, к сожалению, не понял. Вы пишите:
Цитата
Все колбеки выполняются в основном потоке терминала, т.е. пока колбек не завершит работу, терминал будет висеть и ничего не делать.
У меня есть только один колбек OnInit, или нет?

До вызова main в нем неинициализированной глобальной переменой sz_sr присваивается некоторое значение. OnInit завершается (в основном потоке). Затем (если я верно понял) в отдельном потоке запускается и нормально работает main. Никто, вроде, не висит больше. Но почему-то присвоенное значение -- это 0, что обнаруживается в самом же вызове OnInit. Причем лишь каждый ВТОРОЙ запуск скрипта (а иначе -- правильное значение).

Что вообще стоит делать в OnInit? Можно, например, стакан заказать (Subscribe_Level_II_Quotes)?

Очень хотелось бы разобраться. Еще раз благодарю!
 
Цитата
rpns написал:
До вызова main в нем неинициализированной глобальной переменой sz_sr присваивается некоторое значение. OnInit завершается (в основном потоке). Затем (если я верно понял) в отдельном потоке запускается и нормально работает main. Никто, вроде, не висит больше. Но почему-то присвоенное значение -- это 0, что обнаруживается в самом же вызове OnInit. Причем лишь каждый ВТОРОЙ запуск скрипта (а иначе -- правильное значение).

Как уже было сказано и еще раз повторим, пока работает колбек, терминал QUIK просто ждет, ничего не делает.
Вы в колбеке отправили заказ данных, а потом залип на цикле.
Пока цикл не завершится, данные заказанные прошлой строкой не поедут, а пока данные не поедут, цикл согласно логике, не завершится.
Получается замкнутый круг.
При повторном запуске, данные УЖЕ приехали т.к. были заказаны при первом запуске скрипта, по этому второй запуск показывает числа.
main работает в отдельном потоке, по этому там заказ данных и ожидание данных, работают параллельно с поступлением данных в терминал.
по этому в main можно делать цикл, а в колбеке нет.

Цитата
rpns написал:
Кстати, и без вызова SetEmptyCallback. Зачем он тогда?)
Он нужен для подписки на данные. Ровно эту же подписку можно выполнить через терминал, открыв нужный график.
Если Вы откроете график то по сути SetEmptyCallback не нужен, данные и так будут поступать.
Но не всем удобно открывать графики, по этому существует SetEmptyCallback.

Цитата
rpns написал:
Что вообще стоит делать в OnInit? Можно, например, стакан заказать (Subscribe_Level_II_Quotes)?
Что угодно, лишь бы выход из колбека был максимально быстрым, и это касается не только OnInit, а вообще всех колбеков (функции с именем On*)
 
Таким образом, пока callback не завершился, "данные не едут" (потому что терминал не активен и не принимает). Значит, в колбеке ЖДАТЬ данных НЕЛЬЗЯ, а можно только обрабатывать УЖЕ поступившие (например, когда коллбек и вызывается терминалом для обработки последних изменений). Надеюсь, я правильно понял?

Большое спасибо за подробное объяснение!
 
rpns,
да верно
Страницы: 1
Читают тему
Наверх