В функции main для каждого инструмента запускается свой поток. Потоки берутся из пула.
Без иллюстрации кодом вот этого момента, сказать что-то предметное - невозможно. Ибо не понятно чем ваши потоки (где не работает) отличаются от потока main (где работает).
Как-то все в одну кучу. 1. При работе в QLua надо четко различать два абсолютно разных термина "таблица": 1) Таблица как тип данных в программе Lua, т.е.
Код
а = {} -- здесь переменная a - таблица в терминах языка программирования Lua
a[1] = 5 -- так к ней можно обращаться в программе
2) Таблица как элемент визуального интерфейса, таблица, которую вы видите на экране, визуальная таблица с данными. [/CODE] a = AllocTable() -- здесь переменная a содержит в программе идентификатор визуально отображаемой таблицы в терминале QUIK -- дальше вы знаете как работать с такой таблицей, раз у вас она отображается[/CODE]
Теперь понимаете? вы в своём вопросе смешали в кучу две эти совершенно разные "концепции", называемые, к сожалению, одним термином "таблица".
Цитата
и в итоге: attempt to call a nil value (global 'SaveTable')
Потому что штатно нет в QLua функции SaveTable(t_id, SaveResalt) Вам надо найти реализацию нагугленной вами этой функции или написать ее самостоятельно. Замечу, что в данном случае будет идти речь про сохранение значений из "таблицы" в смысле 1), а никак не про визуальные!
Старатель написал: Так тут вопросов больше не брокеру, а к разработчику. Обработкой заявок занимается торговая система биржи. Какой смысл обрабатывать заявку, если пользователь хочет её снять? Это лишняя работа.
Заявка уже в обработке на бирже. По поводу кому какой вопрос - у разработчиков просто недостаточно информации, чтобы предметно ответить на ваш вопрос. Более того, у вас просто нет требуемой им информации. Но есть у брокера, потому и просят зайти через брокера.
Все верно. Не ожидайте какого-либо последовательного изменения статусов. Заявка к вам может приехать в любом статусе, как сразу исполнена, так и частично исполнена, так и сразу снята.
Денис написал: Прежде всего, низкий Вам поклон за Ваш форум, если бы не он, я бы бросил изучать Lua ровно там же, где и начал.
Спасибо Вам на добром слове
Цитата
Например, в скрипте получены значения переменных и он должен просто их сложить. Все прекрасно до тех пор, пока не нажата кнопка "Остановить" - тут скрипт вылетает со словами "Не могу сложить а и б, потому что б равно nil. С какого перепугу, имеющая определенное значение переменная б, вдруг, его теряет после отработки функции OnStop?
Тут бы пример. Честно говоря не верится мне, что если OnStop() содержит только { Stopped = true; return 5; } то переменные, используемые только в main() внезапно становятся равными nil после этого. Ну а по примеру уже можно было бы и подсказать что там не так.
2. Из OnStop() возвращаем 0 Зачем? принуждаем QUIK мгновенно по выходу из OnStop() прибиваь поток main() - чтобы что? чтобы не дать функции потока корректно доработать (хотя доработает она очень быстро в приведенном слуучае), т.к. взводим флаг Stopped Делаем всё, чтобы насильно прибить потоковую функцию, от нее ожидаемо повисают сопли незакрытых ресурсов, куски незафинализированных вызовов Lua. А после - удивительно! - оставшаяся часть софта начинает глючить (и я подозреваю, что QUIK эти 5..7 минут не просто сам по себе живет, наверняка выполняются другие Lua-скрипты)
Ну т.е. сделано все, чтобы ожидаемо получить глюки. Но зачем?? В чем ценность этой демонстрации?
По-моему, код в первом сообщении специально написан так, чтобы максимально пройтись по граблям.
1. Открываем файл в main(), а закрываем зачем-то в другом потоке в OnStop(). Это и само по себе некрасиво просто-напросто (открывать в одном месте, в закрывать в другом, совершенно не связанном ни визуально, ни логически), да еще и ожидаемое может приводить (и приводит) к появлению сообщения "attempt to use a closed file", механизм появления которого вполне понятен. (нет? уточните, мне не сложно, напишу, но потом, не буду это сообщение разбухать).2.
Если записать в QLuа, потом прочитать в QLua и отобразить в quik через message данные - корректно отобразится? Если да - разбирайтесь с тем средством, каким вы просматривает базу , там проблема
но на выходе только mysql.dll, как получить luasql.mysql
Так вам и нужна mysql.dll Просто ее надо положить в папку luasql внутри quik, и тогда, по правилам библиотек Lua, возьмётся библиотека luasql/mysql.dll при загрузке require("luasql.mysql ")
Деградация от версии к версии определённо печалит. Хоть я и поставил бы под сомнение корректность некоторых полученных результатов (v(0) больше, чем v(10000000) ??). Но, похоже, в 9.3 точно случилось что-то.
swerg написал: если вы просто возьмете Луа без привязки к квик - вызов среди десятков тысяч переменных тоже будет тормозить.
Пруф в студию.
Для экспериментов возьмем online lua https://qlua.ru/demo/ Результаты выходят не очень стабильными, но все же проведя пару десятков экспериментов и выкинув пару экстремально отличающихся результатов, получил следующее время выполнения: 100 глобальных переменных - 1,4753 сек 100 тыс. глобальных переменных - 1,5608 сек
Да, разница не фантастически великая. Но какая-то явно есть. Разница много меньше, чем в ваших экспериментах внутри квика, это стоит отметить.
Тестовый код:
Скрытый текст
Код
local function v(n)
for i = n, 1,-1 do
_G["v"..i] = i % 100
end
end
v(100000) -- max 100000 by memory limit
local t = os.clock()
for i = 0, 50000000 do
v56 = v75
end
t = os.clock() - t
print(tostring(v56))
print("time:"..tostring(t))
Только сейчас разглядел создание 50 тыс глобальных переменных Ну и чего вы хотите? функция в ЛУА - это просто глобальная переменная типа "функция". Чтобы функцию вызвать - ее надо найти, на это, очевидно, уходит время. Давайте десятки миллионов глобальных переменных создадим и будем требовать оптимизации. Зачем? кому интересен этот сценарий??
Уверен, если вы просто возьмете Луа без привязки к квик - вызов среди десятков тысяч переменных тоже будет тормозить. Т.е. это такое вполне понятное свойство интерптетатора Луа. Просто не надо заводить десятки тысяч глобальных переменных.
Так что в данном случае я согласен с первыми высказавшимися "флудерам". Завалить можно любую систему. Вот только не со всеми "завалами" есть смысл разбираться, ибо некоторые из них (как здесь) будут сугубо не жизненные.
Я про приведённый скрипт. А если main убрать - станет лучше? В целом в самом деле не понятно по каким критериям вы говорите, что есть загрузка процессора. А совсем этот скрипт остановить - какая загрузка? А запустить скрипт какая загрузка? И сколько ядер у вас процессор, чтобы отмасштабировать цифры. Потому как "большая загрузка" - не понятная вводная. Надо бы знать что такое небольшая для вас и наоборот что большая, в цифрах. Чтобы масштаб проблемы был понятен.
Все-же скрипты с кольеками есть буквально у всех и как-то не особо слышно чтобы тормозил от колбеков так, что прям работать невозможно.
Нет, вы не описали "простой случай". Вы написали свои фантазии про неввполняющийся require. После и вовсе пустились в какие-то фантащийные рассуждения о причинах. Описывать же следует только факты. Т.е. последовательность ваших действий и наблюдаемые эффекты. Просто рекомендация для будущих сообщений
Предлагаю просто вот это вот "переопределял глобальную системную ф-цию" вынести в отдельную функцию в модуле, а не в общем коде. И добавить вызов этой функции в вашем скрипте после require
Вообще ваше исходное сообщение очень путанное. лучше бы вы описали последовательность действий, приводящих в ошибке. Как я понял - при повторном запуске того же самого скрипта не не работает переопределение глобальных функций, описанное в подгружаемом через require модуле.
Берете программку Dependency Walker Открываете в ней вашу Lua_535_x64_dll_for_Quik.dll, смотрите зависимости. Видно, что зависит (из не выложенных вами) от python39.dll У вас на компьютере если вашу библиотеку открыть - напротив python39.dll тоже будет вопросительный значок в желтом кружке?
Изучайте как устроена загрузка DLL в Windiws В частности, переменная среды path Если дело в самом деле в dll-ках, то самое простое положить все требуемые DLL в каталог с quik
Egor Zaytsev написал: К нам можно отправить до 10 мб, более почта не пропускает.
И при этом вы в сообщении терминала просите отправить вам файл дампа на почту. Умно, да. Я понимаю, что всем плевать - одни пишут, другие читают. Но неужели ни у кого нигде не щелкает, что что-то тут не так?
QApplication написал: Что нужно сделать чтобы отключить логирование в файл info.log Сегодня размер файла достигал более 1.2 GB плюс файл alltrade.dat порядка 800 MB.
Никак. Это необходимые данные для работы терминала. Вы заказываете кучу данных - терминал вынужден их где-то хранить. Вот и хранит, для собственных нужд.
Файл info.log можете смело стирать между перезапусками QUIK.
Я только не пойму: по нынешним меркам 2 Гб на диске - это вообще ни о чем, два десятка фоток с телефона буквально. Об чем печаль-то?
Старатель написал: По поводу конструктива, раз уж вы напрашиваетесь.
Парниша, не надо хамить незнакомым людям.
Цитата
Старатель написал: Месяц назад я сообщил о том, что эта функция не работает.
Я бы дополнил "у меня не работает". Это сразу намекнёт на нюансы.
Цитата
Старатель написал: На мой взгляд, этого короткого сообщения более, чем достаточно, чтобы проверить работоспособность новой функции. Спустя месяц, поддержка застряла на выяснении есть ли такое на Демо-доступе (блин, а самому проверить не быстрее было бы) и наименовании класса (как будто на демке, кроме SPBFUT есть другие классы с транзакцией замены заявки).
Вот не в плане спора, исключительно с заботой об улучшении мира напишу я это. Пожалуйста, попробуйте посмотреть на всю ситуацию под другим углом. Нет, не проще. Нет никакого смысла кидаться что-то проверять без уточнения всех деталей. Потому как, я уверен, поддержка проверить именно там, где работает. После этого что - обвинять вас в том, что вы неправду говорите? Да нет же! вы пишете правду, уверен, что у вас в самом деле не работает. Но в каких условиях? на какой бирже? в каком режиме торгов? Причем ваше сообщение о такой проблеме - единственное на форуме. Что тоже странно. Обычно при действительно неработающей фиче форум заваливается сообщениями об одинаковых ошибках.
Я ж потому и говорю. Эмоции ваши прекрасно понимаю; и то, что годами не правятся ошибки - меня дико бесит. Но краткость изложения для баг репорта - штука довольно бессмысленная. Чем полнее - тем полезнее.
Уверен, мир вокруг вас будет непременно становиться лучше!
А вот здесь, кстати, толковое уточнение по наименованию от пользователя. Поправили в документации или нет - не проверял. https://forum.quik.ru/forum10/topic2988/