Latrop написал: никакого сравнения строк (парсинга, вычисления хэшей и т.п.) по содержимому строки в lua тут не происходит.
Справедливости ради, вычисление хэша и поиск строки происходит, если речь о длл и сначала на стек пихается строка с ключом, а потом по ней индексируется таблица. Но это не проблема луа, а проблема дллписателя скорее, строк можно и заранее напихать. А вообще господин Иерусалимский говорит следующее
Aleks написал: обращаться по индексу - самый эффективный способ
Точно ли есть разница, заметная невооруженным глазом, вот в чем вопрос. Я б в сторону for k,v in pairs(t) посмотрел. Раз дело в длл, завсегда можно напихать в локальную сишную структурку сначала, а потом одним разом ее в файл записать, на этом сэкономите времени на пару порядков больше.
Добавлю еще один пунктик в пользу эксепшенов. Они - zero-cost, в отличие от лонгджампов. На первый взгляд, много ли их там... но вспоминаем lua_pcall и как часто ее используют.
Сомневаюсь. Тогда бы из QLuaCheckVersion сделали лонгджамп, а не throw ) Думаю, упустили из виду впопыхах. Старый-то собирали плюсами и не думали о таких высоких материях. Тем более сям по барабану на эксепшены, а вот плюсам на лонгджампы нет, очевидно же, какой вариант стоит выбрать.
Не совсем так, ждет сколько скажут в OnStop. А в целом такой подход "сгорел сарай гори и хата" неправильный, тогда можно вообще не морочиться, натыкать абортов повсюду и все. Все ж я исхожу из того, что хотели как лучше, назвался хостом - давай уже обеспечь, что хост не крэшится и не течет из-за косяков в загружаемом коде.
rst9 написал: это, само по себе, не является проблемой.
Увы и ах, является. Функция вызывается из других функций луа (которые собраны как сишные) и кидает исключение, кроме того, какие-то функции квика по-любому должны вызываться внутри qlua, а они внезапно плюсовые и тоже могут кидать исключения. Луа ждет лонгджампа, исключение пролетит мимо него и будет поймано уже квиком над луа, то есть вся обработка ошибок луа тупо отключается. Не думаю, что так хотели, просто просмотрели. Старый-то луа с эксепшенами был собран и все было хорошо. Вот прям сейчас добавить /TP всем луа-файлам и все соберется без проблем, дело буквально на десять минут, и тогда уже можно дальше смотреть, что еще не так, потому что сейчас дальше смотреть незачем, сейчас любая ошибка повышается до полного краха луа-машины.
Назвал этого франкенштейна QLuaCheckVersion. Вызовы его натыканы в самых неожиданных местах, в luaL_newmetatable например. И в том числе во всех luaopen_*. Видимо, как-то связано с присутствием lua5.1.dll и попыткой обеспечить совместимость. Но самое смешное вот в чем: весь луа таки собран с лонгджампами, теперь это стопроцентно известно, но вот этот довесок кидает исключение, единственное во всей длл.
quio написал: Раньше свою длл нужно было с qlua.dll линковать
Вообще-то с lua5.1.dll от квика, насчет qlua.dll кто-то дезу пустил и так и пошло. Впрочем, работало тоже.
Цитата
quio написал: Создаю новое состояние через lua_newthread(L), передаю его с свой поток, созданный через _beginthreadex, из этого потока вызываю функцию через lua_call. И ничего не проиходит
Latrop написал: Critical error ACCESS_VIOLATION in script
Это теперь так ошибки обрабатываются ) Надеюсь, поправят скоро.
А по существу - должна по идее какая-то ошибка случаться, но воспроизвести не удалось, перезаказал твс, догрузилась до текущего момента и ничего не упало. Вот таким вот образом пробовал
В общем, luaL_openlibs со стейтом из мейна работает, с новым стейтом выбрасывает исключение, через SEH оно отлавливается, там код какой-то длинный (плюсовое?). Если дать ему улететь, квиком вылавливается уже не оно, а 0x05 (ACCESS VIOLATION). Я продолжаю считать, что по крайней мере внешние проявления вызваны смешиванием лонгджампов с эксепшенами, а уж что там изначально за ошибка, надо рыть. Без символов голый асм ковырять как-то тоскливо очень, оставим арке арково.
rst9 написал: в mylib в функции luaopen_mylib() вызываем lua_version(L), с переданным в luaopen_mylib L, из lua53.dll. ее результат равен 0.0. не 5.3 и не 5.1.
Упорный вы какой. Это УКАЗАТЕЛЬ. Функция lua_version() ВОЗВРАЩАЕТ УКАЗАТЕЛЬ. Не 5.3, не 5.1, а УКАЗАТЕЛЬ.
Но можем предполагать, что половина сорцев собрана как си, а половина как плюсы, поэтому где-то вылетают лонгджампы, а где-то ожидаются эксепшены. Конкретно в lua53.dll я увидел одни джампы. В то же время в qlua.dll код явно плюсовый. Очевидно, поскольку это плюсы, LUAI_THROW и LUAI_TRY определены как плюсовые, через эксепшены. А lua53.dll делает джампы. Вот ничего и не ловится. Арке стоит убедиться, что все сорцы луа компилируются как плюсы, а не как си (/TP для компилятора).
rst9 написал: Все это говорит о том, что ваша теория про "разные модули" не совсем верна.
Я уже выше написал, что она неверна в данном случае. Если все работает как надо, она - единственный вариант, но в данном случае стейт не инициализирован, в version NULL, и если не хачили lua_newstate, то это может быть только путем игнора ошибки при инициализации.
Впрочем, есть еще один вариант - это когда один из указателей равен NULL. Статический не может быть NULL, значит, NULL в стейте. Смотрим внутрь lua_newstate, она сразу же ставит version в NULL и устанавливает ее только после того, как вся инициализация стейта прошла без ошибок. Это происходит в функции f_luaopen и там тупо нет варианта не установить версию, либо одна из вызванных функций выкинула ошибку, lua_nestate ее поймала и тут же прибила стейт и вернула NULL, либо все прошло хорошо и версия установлена перед выходом из f_luaopen. Отсюда вывод - одна из функций инициализации ошибку таки выкинула, но lua_newstate ее не поймала. Упс, это ровно то, о чем я писал не далее как вчера. То есть природа косяка та же самая, видимо.
_VERSION это как раз глобальная константа, она зашита в длл намертво и всегда такая, какой была при компиляции, чего на нее смотреть. Вот lua_version куда интереснее.
Конкретно ошибка "multiple Lua VMs detected" вылезает в результате того, что УКАЗАТЕЛЬ на версию в стейте не равен УКАЗАТЕЛЮ на глобальную версию. На самом деле она не такая и глобальная, статическая переменная внутри самой lua_version(). В каком случае указатель на статическую переменную внутри функции может быть не равен указателю на ту же статическую переменную внутри той же функции? Когда это ДВЕ РАЗНЫХ ФУНКЦИИ. Из разных модулей, например. См. сорцы luaL_checkversion_ и lua_version.
В то же время все не так просто, как я выше написал, то есть от самой идеи я не отказываюсь, но обойти косяк, не линкуя lua5.3.dll, а подгрузив ее динамически, я не смог, результат тот же. Откуда следует, что в квике и без нас УЖЕ два экземпляра каким-то образом.
rst9 написал: проблемы будут, если вы создадите стейт при помощи одних функций (скажем, из lua5.1.dll), а будете пытаться манипулировать им при помощи других (например, из lua53.dll).
Об этом и речь, только еще шире, одни функции из 53 и другие функции из 53, одинаковые до байта, но в разных модулях.
rst9 написал: если даже ничего в luaopen_ не делать, а вызвать lua_version() из подгруженной lua53.dll, то все равно, результат ее работы никак не должен быть 0.0.
Дык, насколько понимаю, дело в том, что вы вызываете lua_version() из прилинкованной к вашей длл lua53.dll. Квик до запуска скрипта уже загрузил qlua.dll и запустил машину оттуда, и весь стейт там, а функции из lua53.dll будут работать постольку, поскольку не трогают глобальных переменных луа. Как раз lua_newstate() их трогает, и трогает не те.
Хехе, чудеса. Ошибочка происходит, когда в программе оказываются два луа из разных длл или из экзешника и длл. Сравниваем, как было в 8.3. Весь луа экспортировала qlua.dll, а lua5.1.dll была просто проксей (28 кб размер, кода там нет очевидно). В 8.5 qlua.dll ничего не экспортирует, кроме двух функций плагина, а экспортирует все как раз lua53.dll и, судя по размеру, весь код в ней тоже сидит. Вот так мы и получаем два экземпляра луа в одном процессе.
Latrop написал: Что касается совместимости с 5.1 (видимо для этого там lua5.1.dll), то она несовместимая пока получается.
Подтверждаю, вышеописанная длл из одной функции тоже падает, если собрать под 5.1 и запустить в 8.5. Причем если ошибка не генерируется, падает только скрипт и квик пишет access violation, если генерируется - падает весь квик без дампа. Если убрать lua5.1.dll, разрушения меньше, скрипт просто не может загрузить длл. Так что присутствие ее остается загадкой.
Собираем с 5.1, запускаем в 8.3, получаем три сообщения: ctor, dtor, Exception caught. Все правильно, lua_error генерирует эксепшены и это прекрасно. Теперь собираем с 5.3, запускаем в 8.5, получаем ДВА сообщения: ctor, dtor. Эксепшен не пойман. Допустив, что мой рантайм не обязательно совпадает с арковским, повторил упражнение на чистом SEH. То же самое, нет там эксепшена. Вариант "собирали gcc + dwarf" отметаю как малореальный. Остается вариант...
...луа с лонгджампами собрали? Это же жесть. Может, пока (почти) никто не видел, пересобрать по-тихому? )
Александр М написал: В Документации тоже ни слова, что кстати странно, как минимум должны были именно в Документации озвучить, что версия lua меняется и ссылку дать на различия в версиях.
Справедливости ради, при первом запуске 8.5 выкинул диалог с как раз этим предупреждением о смене версии и ссылкой куда-то, как бы не сюда.
Александр М написал: увидел, что там 2 dll и версии lua 5.1 и версии 5.3 Какая основная
Можно предположить, что 5.1 оставили для какой-то там совместимости, 5.3 экспортирует все то же самое (с поправкой на версию луа). Пока не обнаружил, чтобы что-нибудь крэшнулось без 5.1 (просто убрал ее).
А нет, из квика-то первый скрин, там как раз так и есть. В общем, мы видим, что в квике свеча считается от вчерашнего закрытия, а почему? Локальное время стоит в квике? Влияет ли оно на графики - не знаю.
На скрине опен никак не может быть 2515.05, свеча красная и тень вниз, а с таким открытием она была бы зеленой без нижней тени. Чет где-то нестыковки какие-то.
Уведомление о необходимости обновления торговых терминалов в связи с изменениями на срочном рынке Московской биржи, Список проблем при работе устаревших версий QUIK после обновления торговой системы срочного рынка МБ
Не то слово ) Даже ярлычки создать может быть делом занятным. если мы хотим на всех версиях работать. Потом, если хотим анинсталл зарегистрировать, таки придется в реестр лезть, ну и далее везде. Так-то, если только распаковать, sfx вполне себе справится, но в этом случае лично я бы предпочел зип простой, что сейчас есть и слава богу.
Я б у мозиллы тоже спросил. Думается, если не учитывать msi, ни один движок в x64 не умеет паковать. А msi - последнее, что хотелось бы видеть, этот по-простому распаковать и настроить не умеет, пол-винды перероет.
Старатель написал: Списки сбрасываются при загрузке настроек из *.wnd при установленном соединении с сервером.
Посмотрел внутрь, фильтры по окну там присутствуют, вполне возможно, что квик будет общие фильтры приводить в соответствие в момент загрузки. Но всегда думал, что info.wnd грузится только при запуске квика, ну или если вручную форсировать, неужто и при подключении тоже.
На скрине газпром привязан к левой оси, фьючерс к правой, вот и все чудеса. То есть открываете газпром, потом правый клик по графику, добавить индикатор, в диалоге - "новый", выбираете фьючерс, снимаете галку "поместить в новую область". И вот у вас в одном окне два графика. Потом правый клик - редактировать - выбираете привязку одного к левой оси, другого к правой.
Hired написал: Понял лишь то, что после message ... нужно использовать "table.remove",
Концептуально да, практически удалять элементы из массива, по которому идет итерация, не стоит. Предлагаю другой вариант: перед циклом for создайте временный пустой массив, назовем его temp_sec_code, в цикле проверяете элемент и либо кладете его в новый массив, либо показываете сообщение. Таким образом, во временном массиве у вас бумаги, по которым сообщение еще не показано. По окончании цикла for просто sec_code = temp_sec_code.
Да, квик его стартует каждый раз, когда галка установлена, причем запуск экселя захардкодили, попробуйте другое имя сервера ввести - галка станет неактивной, не умеет квик другие приложения запускать. Но это уже не столь критично, хотя я б по-другому сделал. Можете еще без автозапуска в мой сервер вручную запустить (без галки "при создании") - увидите, как должен был выглядеть первый скрин без ошибки, с заголовками столбцов и нормальным диапазоном. Ну и так, если интересно, можете галками поиграть и посмотреть, как это на поток данных влияет.
А их и не будет, сервер примет любую чепуху, в отличие от настоящего экселя, ему главное показать ее. Второй скрин - это как оно должно быть, это когда уже таблица создалась и заполнилась, едут ячейки со значениями. А вот первый - это как раз на чем настоящий эксель отказывается продолжать, вот этот диапазон R2C1-R2C0 "задом наперед". И должна была приехать первая строка с заголовками столбцов, а ее тоже нет. Очевидно, таблица еще не создана, а квик уже стартанул экспорт. Дело раскрыто, осталось арке поправить.
Anton написал: 3. Открыли настройку экспорта дде. Поставили сервер excel, книга test, лист test, запускать автоматически сняли, вывод после создания поставили.4. Вот в таком виде закрыли квик.
Между 3 и 4 закрыли окно настроек дде, а то ж не сохранится.