В соседних ветках много сообщений о проблемах с версией 8.5, но системы у всех сложные, грешить не понятно на что..
Вот очень простой скрипт, который рушит Квик во время торгов. Упасть может и не сразу, поработав недолго, видимо зависит от интенсивности потока тиков. Ошибок в скрипте нет, он элементарный. Да если бы и были ошибки, то рушиться весь Квик не должен, только скрипт. Для 100% краха можно перезаказать данные текущей сессии. Тогда упадет сразу.
Код
local ticksIn = 0
function OnAllTrade(tick)
if (math.fmod(ticksIn, 5000)==0) then
message("OnAllTrade " .. ticksIn .. " tick: " .. tostring(tick.trade_num))
end
ticksIn = ticksIn + 1
end
mainRun = false
function OnStop(flag)
message("OnStop")
mainRun = false
return 3000;
end
function main()
mainRun = true
message("main run...")
local n = 0
while mainRun do
local ticksNum = getNumberOf("all_trades")
if (ticksNum > 0) then
local tick = getItem("all_trades", ticksNum - 1);
if (math.fmod(n, 1000) == 0) then
message("AllTrades num: " .. ticksNum .. " tick: " .. tostring(tick.trade_num))
end
end
n = n + 1
sleep(1)
end
message("main exit")
end
local ticksNum = getNumberOf("all_trades")
if (ticksNum > 0) then
local tick = getItem("all_trades", ticksNum - 1);
if (math.fmod(n, 1000) == 0) then
message("AllTrades num: " .. ticksNum .. " tick: " .. tostring(tick.trade_num))
end
end
Не факт, что очистка ТВС не произойдет между getNumberOf и getItem, а результат второй разыменовывается без проверки на nil. Перезаказ = крэш. Не квика (должен быть), но скрипта, хотя как сейчас сделано, и нила не надо, сам грохнется, найдет почему.
Занятное наблюдение: в старом луа через пять строчек было EnterCriticalSection, а в новом их вообще нет (ну только что плюсовый рантайм добавил для своих целей). Вот и возникает вопрос, макросы синхронизации тоже что ли забыли переопределить? Или это новый дизайн такой, лок-фри по последнему слову техники (правда, интерлоков тоже чета не видать).
Anton написал: Не факт, что очистка ТВС не произойдет между getNumberOf и getItem, а результат второй разыменовывается без проверки на nil. Перезаказ = крэш. Не квика (должен быть), но скрипта, хотя как сейчас сделано, и нила не надо, сам грохнется, найдет почему.
Имелось ввиду не "Получить заново данные по сделкам", а "Перезаказать данные" - там перезапуск всего Квика происходит. Хотя не суть. Вообще, этот сахар с сообщениями добавлен для наглядности, какой момент упадет.
function OnAllTrade(tick)
end
mainRun = false
function OnStop(flag)
message("OnStop")
mainRun = false
return 3000;
end
function main()
mainRun = true
message("main run...")
while mainRun do
local ticksNum = getNumberOf("all_trades")
local tick = getItem("all_trades", ticksNum-1)
sleep(1)
end
message("main exit")
end
Latrop написал: В соседних ветках много сообщений о проблемах с версией 8.5, но системы у всех сложные, грешить не понятно на что..
Вот очень простой скрипт, который рушит Квик во время торгов. Упасть может и не сразу, поработав недолго, видимо зависит от интенсивности потока тиков. Ошибок в скрипте нет, он элементарный. Да если бы и были ошибки, то рушиться весь Квик не должен, только скрипт. Для 100% краха можно перезаказать данные текущей сессии. Тогда упадет сразу.
Код
local ticksIn = 0
function OnAllTrade (tick)
if ( math.fmod (ticksIn, 5000 ) = = 0 ) then
message ( "OnAllTrade " .. ticksIn .. " tick: " .. tostring(tick.trade_num))
end
ticksIn = ticksIn + 1
end
mainRun = false
function OnStop (flag)
message ( "OnStop" )
mainRun = false
return 3000 ;
end
function main ()
mainRun = true
message ( "main run..." )
local n = 0
while mainRun do
local ticksNum = getNumberOf ( "all_trades" )
if (ticksNum > 0 ) then
local tick = getItem ( "all_trades" , ticksNum - 1 );
if ( math.fmod (n, 1000 ) = = 0 ) then
message ( "AllTrades num: " .. ticksNum .. " tick: " .. tostring(tick.trade_num))
end
end
n = n + 1
sleep ( 1 )
end
message ( "main exit" )
end
1) mainRun = false -- оператор лишний, так как если mainRun не определен, то он false 2) значение n может переполниться когда-нибудь , а вычислять остаток - долго вот вариант без этих проблем: ------------------------- local n = 0 while mainRun do local ticksNum = getNumberOf ( "all_trades" ) if ticksNum > 0 then local tick = getItem ( "all_trades" , ticksNum - 1 ); if n==0 then message ( "AllTrades num: " .. ticksNum .. " tick: " .. tostring(tick.trade_num)) end end n = n + 1 if n>=1000 then n=0 end sleep ( 1 ) end ------------------ проверка условия в два раза быстрее.
Latrop, я б сейчас вообще не очень заморачивался, как именно падает, бо там адъ внутри. Лонгджампы смешаны с исключениями, гарбидж коллектор не работает местами, стейты битые создаются и т.д. Пока версию без этих адовых косяков не выложат, ловить нечего, а дальше будем новые косяки искать.
Цитата
Николай Камынин написал: так как если mainRun не определен, то он false
Если он не определен, то он не определен. Имеете в виду, что если он не инициализирован, то он nil, который в сравнении ведет себя аналогично false. Это не есть хорошая практика. Все эти языки придуманы, чтобы человек прочитал и понял, что происходит, не надо манглить код ради мнимой производительности, или тогда уже сразу массивы опкодов в char[] и jmp туда, вот уж летать будет (но недолго).
Николай Камынин написал: 2) значение n может переполниться когда-нибудь
Это комплимент Квику, что скрипт сможет отработать безостановочно тысячи лет подряд Мир будет на квантовых компьютерах с инопланетянами торговать, а в России будет... Квик
Действительно, есть синхронизационная ошибка, иногда приводящая к сбоям. Мы исправим ошибку в ближайшем обновлении ПО. Приносим извинения за доставленные неудобства.
Действительно, есть синхронизационная ошибка, иногда приводящая к сбоям. Мы исправим ошибку в ближайшем обновлении ПО. Приносим извинения за доставленные неудобства.
Слово "иногда" тут явно лишнее. Можно более конкретно, когда будет ближайшее обновление и что именно там планируется исправить из той кучи ошибок, что уже набралось?