Непонятно, об чем речь. Если о qlua.dll, то при старте загружается, если ее убрать, квик стартанет без пункта меню с луа-скриптами и ничего запустить в принципе не получится. Если о lua53.dll, то в любом случае ДО запуска вашего скрипта, опять же скрипт физически невозможно запустить без нее. Если о какой-то своей подгружаемой длл, то она грузится явно вызовом package.loadlib и на нее действует обычное правило сборки мусора, то есть если она из области видимости вышла и никаких ссылок на нее не осталось (вроде глобальных функций из нее), то будет выгружена. Видимо, вот этот последний вариант и имеется в виду, тогда смотрите, каким образом теряете все ссылки на длл.
Непонятно, об чем речь. Если о qlua.dll, то при старте загружается, если ее убрать, квик стартанет без пункта меню с луа-скриптами и ничего запустить в принципе не получится. Если о lua53.dll, то в любом случае ДО запуска вашего скрипта, опять же скрипт физически невозможно запустить без нее. Если о какой-то своей подгружаемой длл, то она грузится явно вызовом package.loadlib и на нее действует обычное правило сборки мусора, то есть если она из области видимости вышла и никаких ссылок на нее не осталось (вроде глобальных функций из нее), то будет выгружена. Видимо, вот этот последний вариант и имеется в виду, тогда смотрите, каким образом теряете все ссылки на длл.
Это же динамическая библиотека, и мой скрипт загружается в процесс как и эта dll. А скрипт написан на C и слинкован с хидером. Раньше были экспортные функции, но решил, что хидер надежнее. Это вкратце, как сделано.
А проблема в том, что иногда при старте скрипта пишется ошибка что lua53.dll не найдена (видимо еще не загружена в процесс). А если закрыть окно с управлением скриптов и открыть, и еще раз запустиь - магически dll уже будет находится.
Подозреваю, что lua53 не грузится на старте. Поэтому и глюк такой. А скрипт у меня не тянет их dll, так как скомпилирован с хидером.
Перемудрили они видимо с lua53. Заглушка эта не используется самим терминалом. Поэтому скрипты могут попадать на такие пакости.
timber написал: Это же динамическая библиотека, и мой скрипт загружается в процесс как и эта dll. А скрипт написан на C и слинкован с хидером. Раньше были экспортные функции, но решил, что хидер надежнее.
Не понял. Вы включили lua.h, но не линковали с lua53.lib, так? Тогда это ваша задача, искать или загружать lua53.dll и тащить из нее функции через GetProcAddress, хидер сам по себе ничего такого не делает.
Цитата
timber написал: А проблема в том, что иногда при старте скрипта пишется ошибка что lua53.dll не найдена (видимо еще не загружена в процесс). А если закрыть окно с управлением скриптов и открыть, и еще раз запустиь - магически dll уже будет находится.
Этого не может быть, потому что не может быть никогда (про не загружена в процесс). Это раньше была заглушка lua5.1.dll и весь луа по факту сидел в qlua.dll, теперь все иначе, весь луа в lua53.dll находится, и если квик вообще смог ваш скрипт запустить, это стопроцентно означает, что lua53.dll уже загружена и должна находиться через GetModuleHandle.
Мысль пришла - вы, часом, весь луа в своей длл не продублировали?
timber написал: Это же динамическая библиотека, и мой скрипт загружается в процесс как и эта dll. А скрипт написан на C и слинкован с хидером. Раньше были экспортные функции, но решил, что хидер надежнее.
Не понял. Вы включили lua.h, но не линковали с lua53.lib, так? Тогда это ваша задача, искать или загружать lua53.dll и тащить из нее функции через GetProcAddress, хидер сам по себе ничего такого не делает.
Цитата
timber написал: А проблема в том, что иногда при старте скрипта пишется ошибка что lua53.dll не найдена (видимо еще не загружена в процесс). А если закрыть окно с управлением скриптов и открыть, и еще раз запустиь - магически dll уже будет находится.
Этого не может быть, потому что не может быть никогда (про не загружена в процесс). Это раньше была заглушка lua5.1.dll и весь луа по факту сидел в qlua.dll, теперь все иначе, весь луа в lua53.dll находится, и если квик вообще смог ваш скрипт запустить, это стопроцентно означает, что lua53.dll уже загружена и должна находиться через GetModuleHandle.
Мысль пришла - вы, часом, весь луа в своей длл не продублировали?
1) Я и делаю через GetProcAddress 2) Я новый код уже перекомпилировал под qlua.dll обратно и пробую на 8.2. Работает как часы. Думаю, что глюка у Арки. В добаков в 8.5, 8.6 так же работает, но со второй попытки. Думается, ребята что-то перемудрили.
Нет, я только скомпилировал с хидером, чтобы отойти от меняющихся наборов функций.
timber написал: Нет, я только скомпилировал с хидером, чтобы отойти от меняющихся наборов функций.
Как вы это сделали? Если заинклюдить lua.h и потом вызвать хоть одну функцию из него, не линкуясь с lua53.lib, линкер скажет unresolved external. Значит, вы объявляете указатели на луа-функции и потом их инициализируете ручками через GetProcAddress, верно? И откуда берете хэндл lua53.dll? Через GetModuleHandle("lua53.dll"), так? И на этом этапе получаете периодически NULL, так? Или иначе как-то?
timber написал: Нет, я только скомпилировал с хидером, чтобы отойти от меняющихся наборов функций.
Как вы это сделали? Если заинклюдить lua.h и потом вызвать хоть одну функцию из него, не линкуясь с lua53.lib, линкер скажет unresolved external. Значит, вы объявляете указатели на луа-функции и потом их инициализируете ручками через GetProcAddress, верно? И откуда берете хэндл lua53.dll? Через GetModuleHandle("lua53.dll"), так? И на этом этапе получаете периодически NULL, так? Или иначе как-то?
Спасибо за информацию и расвитие кругозора. Может быть у меня ошибка, может быть в Квик. Не знаю, надо долго разбираться. В итоге я забиваю на проблему. Оно работает, в принципе. И мне этого достаточно. Будет дискомфорт продолжу. Или программисты Арки что-то сами найдут.
Жаль. У меня тоже есть дллки без прилинкованного луа и даже без сишного рантайма. Я их всех тут перепробовал по тридцать раз в 8.6 после вашего сообщения и ничего такого не обнаружил. Поэтому хотелось понять, как вы такого эффекта добились.
Жаль. У меня тоже есть дллки без прилинкованного луа и даже без сишного рантайма. Я их всех тут перепробовал по тридцать раз в 8.6 после вашего сообщения и ничего такого не обнаружил. Поэтому хотелось понять, как вы такого эффекта добились.
От Квик никто не ответил. Я склоняюсь, что это моя ошибка где-то. Не хочу теребить о несуществующих проблемах разрабов. Если будет кто-то еще со схожей проблемой, я попробую что-то нарыть.
Почему-то квик перестал видеть некоторые индикаторы. Причем, если добавить его в lua-скрипты, то он начинает видеться, и потом работает нормально. Но при перезагрузке индикатор снова становится пустым, и надо выполнять те же действия. В чем проблема может быть?
Да, и после того, как индикатор начинает видеть система, то его надо удалить из графика и снова добавить, тогда он начинает нормально работать. До перезагрузки квика.
Сергей написал: Почему-то квик перестал видеть некоторые индикаторы. Причем, если добавить его в lua-скрипты, то он начинает видеться, и потом работает нормально. Но при перезагрузке индикатор снова становится пустым, и надо выполнять те же действия. В чем проблема может быть?
Добрый день.
Проверили на версии 8.6.0. Работает корректно. Нужен какой нибудь конкретный пример. Сообщите версию рабочего места и выложите для примера индикатор.
Egor Zaytsev написал: Нужен какой нибудь конкретный пример. Сообщите версию рабочего места и выложите для примера индикатор.
Версия 8.6.0.97
Settings = { Name = "%WR(BR_1)-STAT+Line", Period = 14, line = {{ Name = "Horizontal line (top)", Type = TYPE_LINE, Color = RGB(100, 100, 255) }, { Name = "Horizontal line (bottom)", Type = TYPE_LINE, Color = RGB(100, 100, 255) }, { Name = "WR", Type = TYPE_LINE, Color = RGB(255, 128, 0) } }, Round = "off", Multiply = 1, Horizontal_line="30" -- Задается отступ вверх/вниз от центральной линии(-50) }
function Init() func = WR() return #Settings.line end
--local Sound = 1 -- Если <1>, то проигрываем звук local ldt = 0 -- last day-time -- подключить библиотеку w32 local w32 = require ("w32") -- добавляем библиотеку local FName = "c:\\BCS_Work\\Stat.txt" local LastPrc = 0 local LastN = 0 local LastOut = -50
-- функция проигрывания файла -- вызов: PlaySoundFile("имя файла") function PlaySoundFile(file_name) w32.mciSendString("CLOSE QUIK_MP3") w32.mciSendString("OPEN \"" .. file_name .. "\" TYPE MpegVideo ALIAS QUIK_MP3") w32.mciSendString("PLAY QUIK_MP3") end
function OnCalculate(Index) local N=getNumCandles("BR_1") -- Получаем число свечей в графике local Out = ConvertValue(Settings, func(Index, Settings)) local HL = tonumber(Settings.Horizontal_line) local HLine = -50+HL local LLine = -50-HL if HL then dt1 = tonumber(os.date("%Y%m%d%H%M%S")) if (Out == 0 or Out==-100) then if N==Index then if LastPrc ~= C(Index) or LastN ~= N then local FStat = io.open(FName, "a") FStat:write(os.date("%Y/%m/%d %H:%M:%S") .. " " .. tostring(C(Index)) .. " " .. tostring(Out) .. "\n") FStat:flush() FStat:close()
message("WR = " .. tostring(Out) .. "; EP = "..tostring(C(Index))) LastPrc = C(Index) LastN = N end if dt1-ldt > 10 then if Out == 0 then PlaySoundFile("C:\\BCS_Work\\QUIK_BCS\\LuaIndicators\\Higher.wav") else PlaySoundFile("C:\\BCS_Work\\QUIK_BCS\\LuaIndicators\\Paday.wav") end ldt = dt1 end end else if N==Index then if (Out <= HLine and LastOut > HLine) or (Out >= LLine and LastOut < LLine) then if dt1-ldt > 10 then PlaySoundFile("C:\\BCS_Work\\QUIK_BCS\\LuaIndicators\\Ring04.wav") ldt = dt1 end end end end LastOut = Out return HLine,LLine,Out else return nil,nil,Out end end
function WR() --Williams' % Range ("WR") local H_tmp={} local L_tmp={} local it = {p=0, l=0} return function (I, Fsettings, ds) local Fsettings=(Fsettings or {}) local P = (Fsettings.Period or 10) if (P>0) then if I == 1 then H_tmp={} L_tmp={} it = {p=0, l=0} end if CandleExist(I,ds) then if I~=it.p then it={p=I, l=it.l+1} end H_tmp[Squeeze(it.l,P)+1] = GetValueEX(it.p,HIGH,ds) L_tmp[Squeeze(it.l,P)+1] = GetValueEX(it.p,LOW,ds) if it.l>P then local val_h=math.max(unpack(H_tmp)) local val_l=math.min(unpack(L_tmp)) return -100*(val_h-GetValueEX(it.p,CLOSE,ds))/(val_h-val_l) end end end return nil end end
function Squeeze(I,P) return math.fmod(I-1,P+1) end
function ConvertValue(T,...) local function r(V, R) if R and string.upper®== "ON" then R=0 end if V and tonumber® then if V >= 0 then return math.floor(V * 10^R + 0.5) / 10^R else return math.ceil(V * 10^R - 0.5) / 10^R end else return V end end local arg = {...} arg.n = select('#', ...) if arg.n > 0 then for i = 1, arg.n do arg[i]=arg[i] and r(arg[i] * ((T and T.Multiply) or 1), (T and T.Round) or "off") end return unpack(arg) else return nil end end
function GetValueEX(I,VT,ds) VT=(VT and string.upper(string.sub(VT,1,1))) or ANY if VT == OPEN then --Open return (O and O(I)) or (ds and ds:O(I)) elseif VT == HIGH then --High return (H and H(I)) or (ds and ds:H(I)) elseif VT == LOW then --Low return (L and L(I)) or (ds and ds:L(I)) elseif VT == CLOSE then --Close return (C and C(I)) or (ds and ds:C(I)) elseif VT == VOLUME then --Volume return (V and V(I)) or (ds and ds:V(I)) elseif VT == MEDIAN then --Median return ((GetValueEX(I,HIGH,ds) + GetValueEX(I,LOW,ds)) / 2) elseif VT == TYPICAL then --Typical return ((GetValueEX(I,MEDIAN,ds) * 2 + GetValueEX(I,CLOSE,ds))/3) elseif VT == WEIGHTED then --Weighted return ((GetValueEX(I,TYPICAL,ds) * 3 + GetValueEX(I,OPEN,ds))/4) elseif VT == DIFFERENCE then --Difference return (GetValueEX(I,HIGH,ds) - GetValueEX(I,LOW,ds)) else --Any return (ds and ds[I]) end return nil end
Здравствуйте, на версии 8.6.097, проблема с general protection fault с версии 8.5 никуда не исчезла! Продолжает валиться квик на рабочих lua скриптах с версии 7.27.1. Произвольно, иногда при запуске сразу, иногда через небольшое время. Дамп, скрины отправил в поддержку, уже второй раз!
Скрипты поменял, учел изменения в lua 5.3, никаких подключаемых внешних библиотек нет, только код. Отправлять саппорту терминал со всеми скриптами не вариант!
Это же жесть!! Ранее эксперименты с квиком можно было игнорировать, не участвуя в сырой отладке на пользователях, оставаясь на старой версии, а теперь через пару недель запустят изменения на бирже, на версии 7 оставаться, как пишет саппорт нельзя, новая валится, что делать?????
Сергей написал: Дата перехода биржи на работу с 19-значными номерами заявок и сделок уже известна?
Добрый день.
Данные изменения запланированы на вторую половину текущего года. К сожалению, пока точная дата не известна, но вы можете уточнить вопрос у специалистов технической поддержки биржи.
Nikolay написал: У меня в 8.* версиях индикаторы не работают, если в них есть require. Приходится через load грузить. Но с dll так не пройдет.
Добрый день.
Проверили. Работает и на 8.4.1 и на 8.6, библиотеки через require() грузятся в индикаторах, ошибок нет. Нужен конкретный пример и если возникают ошибки, то их тоже.
Иван Ру написал: Объясните для тех кто в танке - 19-значные номера заявок на ММВБ уже ввели или нет? Какая дата у события?
Добрый день.
На данный момент нет, по информации биржи это случится во второй половине этого года, но даты еще нет. Можете уточнить у специалистов технической поддержки биржи.
Сергей написал: Это просто Wiliams % Range с прикрученным выводом звука на 0 -100 и при пересечении уровня и сбором статистики в файл
Здравствуйте!
Ваше обращение получено, проблема изучается. Постараемся в ближайшее время дать ответ.
Ситуация иправляется, если подключаемую по require библиотеку переместить из /luaindicatos в папку квика. Причина мне непонятна, ну да ладно... ¯\_(ツ)_/¯
Сергей написал: Это просто Wiliams % Range с прикрученным выводом звука на 0 -100 и при пересечении уровня и сбором статистики в файл
Здравствуйте!
Ваше обращение получено, проблема изучается. Постараемся в ближайшее время дать ответ.
Ситуация иправляется, если подключаемую по require библиотеку переместить из /luaindicatos в папку квика. Причина мне непонятна, ну да ладно... ¯\_(ツ)_/¯
Ранее мы сталкивались с похожей ситуацией, тогда помогло вместо функции require использовать package.loadlib Например так: package.loadlib(getScriptPath() .. "\\some.dll", "luaopen_somemetod")() где вместо some.dll указать имя Вашей DLL и вместо luaopen_somemetod указать имя Вашего метода.
Стартовое сообщение данной темы форума обновлено: обновлена ссылка на актуальную версию рабочего места QUIK (8.7.1), добавлены пункты 9-13 в список вопросов/ответов.
Почему после добавления в график аллигатора начинает выдавать ошибку вот этот код(и не только этот, а и другие самописные индикаторы)
Settings= { Name = "VolMA", period = 8, line = { { Name = "VMA", Color = RGB(0, 128, 64), Type = TYPE_LINE, Width = 1 } } }
function Init() return 1 end
function OnCalculate(index) if index < Settings.period then return nil else local sum = 0 for i = index-Settings.period+1, index do sum = sum + V(i) end return sum/Settings.period end end
Говорит: VolMA.lua:26: attempt to perform arithmetic on a nil value это не только с аллигатором, но и с индикатором открытых позиций тоже. В чём может быть причина? Спасибо!
Проверили. Индикатор добавился без ошибок. Какая у Вас версия рабочего места QUIK, каким образом добавляете данных скрипт? Напомним, что необходимо файл поместить в папку с названием LuaIndicators в директории с программой QUIK.
Сергей написал: Версия 8,7,1,3 Индикатор именно в этой папке. Вы вместе с аллигатором пробовали?
Добрый день.
Сейчас проверили.
Дело в том, что индикатор Аллигатор сдвигает график «в будущее» на несколько свечек, из-за этого при добавлении Lua индикатора он пытается считать значения по несуществующим на графике цены и объема свечкам, которые есть только на графике индикатора Аллигатор. Нужно проверять существует ли свечка с указанным индексом.
function OnCalculate(index)
if index < Settings.period or not CandleExist(index) then
Опасно. Терминал 8.8.1.5 ещё не готов к работе, т.к. падает с дампами. Пользователям ещё повезло, что у биржи менялись приоритеты (возможность отрицательных цен) и из-за этого дата всё отодвигалась.
Неясно, успеют ли разработчики за оставшийся месяц залечить дыры.
_sk_ написал: Опасно. Терминал 8.8.1.5 ещё не готов к работе, т.к. падает с дампами. Пользователям ещё повезло, что у биржи менялись приоритеты (возможность отрицательных цен) и из-за этого дата всё отодвигалась.
Неясно, успеют ли разработчики за оставшийся месяц залечить дыры.
Добрый день.
Если падает терминал, то этот вопрос надо исследовать. Пришлите dmp файлы нам на quiksupport@arqatech.com будем разбираться.
Как только падает тестовый терминал -- шлю вам дампы (CQ02798550). Архив терминала и QLua-скрипты выслать нет возможности. На реальную эксплуатацию страшно ставить, т.к. при завале 10 скриптов потом долго и дорого последствия разбирать.
По субъективным ощущениям, падения учащаются при параллельной эксплуатации нескольких QLua-скриптов, которые интенсивно запрашивают свечные данные из DataSource-объектов. В принципе, могу попытаться написать тестовый стенд. Может, на нём удастся воспроизвести эти падения.
_sk_ написал: Опасно. Терминал 8.8.1.5 ещё не готов к работе, т.к. падает с дампами. Пользователям ещё повезло, что у биржи менялись приоритеты (возможность отрицательных цен) и из-за этого дата всё отодвигалась.
Неясно, успеют ли разработчики за оставшийся месяц залечить дыры.
Добрый день.
Если падает терминал, то этот вопрос надо исследовать. Пришлите dmp файлы нам на quiksupport@arqatech.com будем разбираться.
Вам Юрий шлет дампы постоянно. Мало того терминал показывает увеличение занятой оперативной памяти вообще без запущенных скриптов на 2 разных компьютерах и это увеличение не застывает, а продолжает расти.
_sk_ написал: Как только падает тестовый терминал -- шлю вам дампы (CQ02798550). Архив терминала и QLua-скрипты выслать нет возможности. На реальную эксплуатацию страшно ставить, т.к. при завале 10 скриптов потом долго и дорого последствия разбирать.
По субъективным ощущениям, падения учащаются при параллельной эксплуатации нескольких QLua-скриптов, которые интенсивно запрашивают свечные данные из DataSource-объектов. В принципе, могу попытаться написать тестовый стенд. Может, на нём удастся воспроизвести эти падения.
С проблемой CQ02798550 еще разбираемся, обязательно дадим ответ.
По моему скромному мнению, перевод QUIK на Lua 5.3… является стратегической ошибкой ARQU, если ориентироваться на пользователя, а не на хайп.
Во-первых, функционально, с учетом архитектурно тесной интеграции Lua c языком C/C++, это, мягко говоря, сомнительный шаг, так как все, что не реализовано в Lua 5,1, по сравнению с Lua 5.3 (а это мало кому нужно), можно реализовать в языке C++. В том числе и длину номеров заявок (>= 19).
Во-второых, при переходе на Lua 5.3 для пользователя заметно меняется среда разработки в части используемых dll-библиотек. Надо ли это нормальным пользователям?
Во-третьих, для самих разработчиков QUIK возникает большой геморрой в связи с необходимостью переработки управление автоматической памятью Lua 5.3… (оно существенно отличается от того, что было в Lua 5.1) так, чтобы оно было в QLua 5.3... потокобезопасным (задача, конечно, интересная, но нетривиальная задача параллельного программирования, требующая высокой квалификации). Необходимость потокобезопасности управления автоматической памятью QLua обусловлена тем, что все служебные функции обратного вызова QLua запускаются в потоке отличном от пользовательского (с именем main), но в среде (памяти) пользователя.
Что мы имеем на текущий момент (12.08.20). Пользователи отлаживают, начиная с марта 2020г.все новые и новые версии (8.5…, 8.6…, 8.7…, 8.8…). Прошло уже 5 месяцев как нас кормят обещаниями стабильной новой версии QUIK. При запусках моего теста управления автоматической памятью во всех QLua версиях >= 8.5 в произвольные моменты времени, но в интервале 10 минут, возникают дампы ( все они пересланы мной в поддержку ARQU). Причем в QUIK версий < 8.5 проблем с управлением автоматической памятью QLua мной не обнаружено.
Пока в версии >= 8.5 не будет реализовано корректное потокобезопастное управление автоматической памятью версий QLua >= 8.5, QUIK будет нестабильным (надеюсь что разработчики QUIK это понимают).
-------
Я понимаю, что отказаться от перевода QUIK на Lua 5.3… для ARQU практически невозможно, но, если ориентироваться на результат, то имело бы смысл «заморозить» перевод QUIK на Lua 5.3… и перенести накопленные нормально работающие фичи версий >=8.5… (в том числе длину номеров заявок = 19 ) в последнюю версию 8.4…… В противном случае, скорее всего, нас ждет длительное шоу новых версий QUIK.
_sk_ написал: Опасно. Терминал 8.8.1.5 ещё не готов к работе, т.к. падает с дампами. Пользователям ещё повезло, что у биржи менялись приоритеты (возможность отрицательных цен) и из-за этого дата всё отодвигалась.
Неясно, успеют ли разработчики за оставшийся месяц залечить дыры.
Добрый день.
Если падает терминал, то этот вопрос надо исследовать. Пришлите dmp файлы нам на quiksupport@arqatech.com будем разбираться.
Вам Юрий шлет дампы постоянно. Мало того терминал показывает увеличение занятой оперативной памяти вообще без запущенных скриптов на 2 разных компьютерах и это увеличение не застывает, а продолжает расти.
Добрый день. С каждым обращением мы разбираемся. С каждым случаем нужно разбираться отдельно. Если у Вас наблюдаются проблемы с загрузкой оперативной памяти, то просьба прислать архив рабочего места (без ключей) нам на quiksupport@arqatech.com
TGB написал: Я понимаю, что отказаться от перевода QUIK на Lua 5.3… для ARQU практически невозможно, но, если ориентироваться на результат, то имело бы смысл «заморозить» перевод QUIK на Lua 5.3… и перенести накопленные нормально работающие фичи версий >=8.5… (в том числе длину номеров заявок = 19 ) в последнюю версию 8.4…… В противном случае, скорее всего, нас ждет длительное шоу новых версий QUIK.
TGB написал: При запусках моего теста управления автоматической памятью во всех QLua версиях >= 8.5 в произвольные моменты времени, но в интервале 10 минут, возникают дампы ( все они пересланы мной в поддержку ARQU). Причем в QUIK версий < 8.5 проблем с управлением автоматической памятью QLua мной не обнаружено.
Может стоит им отправить свой тестовый стенд, быстрее дело пойдет.
Кто хочет результата, выкладывает здесь тестовый скрипт, здесь есть достаточно заинтересованные люди, чтобы потратить время, прогнать у себя, подтвердить баг и тем самым сподвигнуть арку на подвиги, либо обнаружить косяк в самом тесте.
Anton написал: Кто хочет результата, выкладывает здесь тестовый скрипт, здесь есть достаточно заинтересованные люди, чтобы потратить время, прогнать у себя, подтвердить баг и тем самым сподвигнуть арку на подвиги, либо обнаружить косяк в самом тесте.
Для заинтересованных людей ссылка на коды теста: https://cloud.mail.ru/public/2Emr/QBCqEvATr За найденные баги в тесте буду благодарен. ---------------------------------------- Ниже приводится инструкция по запуску теста (непосредственно из письма, посланного в поддержку QUIK). ----
Новая версия (от 06.08.20) QUIK 8.8.1.5 продолжает «падать» (CQ02750791, CQ02779753, CQ02787899). Тестовая программа, вызывающая падение (с инструкцией по установке и ее запуску).
Здравствуйте!
QUIK 8.8.1.5 «падает» похожим образом, как это было в предыдущих версиях (начиная с 8.5….). Кроме того, в QUIK в мониторе ресурсов, наблюдается утечка памяти.
Для того, чтобы у вас была оперативная возможность отладки очередной версии, я высылаю не дамп, а мою тестовую программу (с кодами и инструкцией по ее запуску), в которой дампы возникают быстро (у меня в течении 5 минут), но в произвольные моменты. Эта же программа (с dll оттранслированными для Lua 5.1) непрерывно (месяцами) без проблем работает во всех версиях QUIK < 8.5. Одна из функций данной программы, которая включена сейчас по умолчанию, это тестирование автоматического управления памятью в QLua. Особенностью теста является высокая нагрузка (1500 обращений в секунду) на управление автоматической памятью QLua в условиях многопоточности.
Если потребуется, я пришлю коды этой же тестовой программы (с dll оттранслированными для Lua 5.1), нормально работающей в версиях 8… < 8.5.
------
Инструкция по установке и запуску тестовой программы.
Для установки и запуска программы надо выполнить следующее:
1) распаковать архив OS_Quesha 8_5.zip;
! После распаковки исполняемые файлы в папке «… OS_Quesha\packages» и «…OS_Quesha\packages\Файлы папки QUIK» могут оказаться заблокированными;
их необходимо разблокировать;
Файлы можно разблокировать в их свойствах.
Для быстрой разблокировки всех файлов папки:
- откройте консоль PowerShell (под Админом) и выполните в ней команду get-childitem "полный путь папки" | unblock-file, предварительно заменив содержимое кавычек полным адресом к папке с заблокированными файлами.
2) получившуюся папку OS_Quesha переслать на диск C (в корень);
3) переслать все файлы (их два) из папки C:\OS_Quesha\packages\Файлы папки QUIK в папку хранения info.exe ( на диске установки QUIK);
4) в меню QUIK <Сервисы> -> <Lua скрипты ...> добавить скрипт-шаблон "TS_QUIK.lua" из папки C:\OS_Quesha;
5) запустить добавленный скрипт (это можно делать в QUIKе без подключения к серверу); при этом появится окно диалога OS_Quesha.
-------------------------
При нормальной работе теста в поле Сообщения диалога с интервалом 5 секунд выдаются сообщения:
<@> <Дата | Время> <6.0> Тест управления памятью QLua. Количество синхронизаций = Количество
Пока значение Количество меняется (с интервалом в 5 секунд) тест выполняется без ошибок.
Ошибки теста проявляются следующим образом:
1) QUIK «падает» (иногда очень быстро) с сохранением дампа, а иногда и без сохранения;
2) Прграмма OS_Quesha зависает и Количество синхронизаций перестает меняется. Тогда про попытке завершения скрипта зависает или падает QUIK.
-----------
Если скрипт "TS_QUIK.lua" запускать многократно то, в какой-то (произвольный) момент возникает дамп QUIK. В версиях QUIK < 8.5 дампов не возникает.
Для завершения работы с OS_Quesha достаточно закрыть окно ее диалога или остановить крипт в меню QUIK.
------
Внимание! Для того чтобы нормально работали пакеты dll, в W10(64р), в папке C:\Windows\System32 и в C:\Windows\SysWOW64 должны быть (в каждой из них) файлы: msvcp140d.dll, msvcr120d.dll, ucrtbased.dll, vcruntime140d.dll
Иначе QLua может выдавать сообщение: Не существует модуль…….
Все же речь была о заинтересованных в отладке квика, а не вашей операционной системы. А для этого нужен (насколько возможно примитивный) луа-скрипт, показывающий, что гарбидж коллектор в квике работает некорректно, как вы утверждаете. Из описанного поведения пункт 2 это ТОЧНО дедлок у вас в коде, пункт 1 может быть от чего угодно, как из него следует косяк именно в коллекторе, непонятно. Попытался найти, где у вас этот тестовый код зарыт, не нашел. В чем смысл такого теста остается неясным.
Anton написал: Все же речь была о заинтересованных в отладке квика, а не вашей операционной системы. А для этого нужен (насколько возможно примитивный) луа-скрипт, показывающий, что гарбидж коллектор в квике работает некорректно, как вы утверждаете. Из описанного поведения пункт 2 это ТОЧНО дедлок у вас в коде, пункт 1 может быть от чего угодно, как из него следует косяк именно в коллекторе, непонятно. Попытался найти, где у вас этот тестовый код зарыт, не нашел. В чем смысл такого теста остается неясным.
Тестирование проблем синхронизации задача сложная и это подтверждается тем, что сама АРКИ, похоже, за десятилетия существования не разработала достаточно валидного теста потокобезопасного управления автоматической памятью QLua. Я сделал такой тест давно в виде утилиты в своей системе для себя (и он реализован с существенным использованием среды исполнения моей системы и я, к сожалению, не могу его изобразить в виде простенького скрипта, как предлагаете вы) . В том виде, в котором я его выложил, этот тест запускается по умолчанию и для специалиста, с моей точки зрения, этого достаточно. Я думаю разработчики QUIK смогут в нем разобраться. Если же он вам не понятен, то вы можете попробовать предложить свой простой тест. Еще один момент, который я специально отметил:
Цитата
TGB написал: Эта же программа (с dll оттранслированными для Lua 5.1) непрерывно (месяцами) без проблем работает во всех версиях QUIK < 8.5.