Виталий (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 След.
Вопрос по стеку Lua, стеку Lua и нюансы его чтения
 
Цитата
nikolz написал:
QLUA - это библиотека функций, написанная на СИ
---------------------------
VMLua - это виртуальная вычислительная машина ,
тоже написанная на CИ ,
интерпретирующая байт-код скрипта Lua.  
Но ведь ветка называется "Программирование на языке Lua".
Вопрос по стеку Lua, стеку Lua и нюансы его чтения
 
Цитата
nikolz написал:
1. Вы ошибаетесь. NULL и nil это не одно и то же. Это одно и тоже в objective-c, но не в луа. В Lua  нет NULL.
Допустим, но глобально в текущей ситуации это разве что-то меняет? Это пусто, 0, ничего, false.

Цитата
Serge123 написал:
Но если сравнить различные языки, то ,  если в данных присутствуют значения NULL, логические операторы и операторы сравнения могут возвращать, кроме TRUE или FALSE, также и третий результат — UNKNOWN.
Только JS встречал, с которым сейчас в основном и работаю. Больше нигде.

Цитата
nikolz написал:
2.  Этот способ адресации  делает VMLua не только стековой машиной, но и регистровой машиной.Отрицательный индекс удобен, когда  работаем с вершиной, положительные, когда работаем с фактическими параметрами функций.
Ну вот примерно про это я и спрашивал. Получается, что это просто работа со стеком таким образом, чтобы не превращать его в массив. Стек - это первый зашел и последний вышел. А если читать стек по положительным индексам - это массив получится. Получается, что это просто выбор разраба, как читать - ок. Меня это и интересовала: это правило или просто так сложилось.

Цитата
nikolz написал:
4.   Зря Вы не читаете учебники и документацию, а придумываете объяснение сами. Проблема Вашего непонимания в том, что Вы не знаете архитектуры процессоров.Пытаетесь разобраться в "железе" на основе знания какого-либо языка программирования. --------------------  Очевидно, что Ваши ощущения - это и есть результат незнания.
Ну так я сюда и пришел за знаниями. Разве форумы не для того чтобы быстро получить ответ на вопрос и продвинуться дальше? Читать документацию и прочее можно до бесконечности. У меня знакомый 4 года назад начал изучение ReactJS с чтения документации, тогда как я советовал ему освоить базу и начать работать. До сих пор учит. Зачем же в такие крайности?

Цитата
nikolz написал:
Подробнее написано в ссылках, выше и в других статьях в интернете.
Спасибо.
Вопрос по стеку Lua, стеку Lua и нюансы его чтения
 
Цитата
funduk написал:
Виталий, "2. Вот зачем и почему? Т.е. я не понимаю почему в одном случае мы читаем  через 1, а в других через -1. От чего зависит? Ну т.е. есть какое-то  правило по которым таблицы сверху всегда или что, почему таблицы  обчитываются через отрицательные индексы сверху стека?"
Вы такой вопрос задаёте и тогда, когда в питоне видите отрицательные индексы в списках? Это известная идиома в интепретируемых языках и стек-машинах (виртуальных машинах), чисто для удобства программиста, чтобы ему не высчитывать номер индекса с начала контейнера (списка, строки, стека), если он знает номер с конца. В луа от этого проигрыш в скорости небольшой, но есть.
На пайтоне я не пишу, никак до него не дойду и то в рамках нейросеток интересен, не более. Но суть вопроса не в том, почему индекс отрицательный, а почему во всех примерах с таблицами я вижу использование отрицательных индексов, а в примерах с передачей строки/числа - положительный. Это чисто совпадение или таблицы всегда кладут сверху стека? Т.е. можно ли это считать постоянным событием или нужно всегда проверять не таблица ли передо мной (видел вроде метод такой)?
Вопрос по стеку Lua, стеку Lua и нюансы его чтения
 
Цитата
nikolz написал:
Цитата
Виталий написал:
1. Вопрос к знатокам: при работе со стеком, перед началом чтения через lua_next(L, -2), нам необходимо делать lua_pushnil(L). Зачем? Ведь это по сути означает "положить сверху NULL". Для чего мы это делаем?
2. Далее, почему в некоторых случаях мы читаем данные, как lua_tostring(L, -1). А в некоторых lua_tostring(L, 1). Если я правильно понимаю - это не одно и то же. В стеке из двух элементов индекс 1 - это низ стека, а -1 - верх стека!
3. Потом, для чего мы делаем lua_pop(L, 1); при использовании lua_next(L, -2), когда читаем стек? Ведь это удалит только один верхний элемент и все. Т.е., когда я читаю из стека некую таблицу - я должен посмотреть ключ (поле) по lua_next(L, -2) и, если он есть, то прочесть данные через lua_tostring(L, -1). Но потом я удаляю всего 1 элемент сверху. Не понимаю, что за дичь.
4. Есть у кого-то понимание / объяснение / картинка как выглядит стек qLua, когда в нем лежат смешанные данные? Т.е. как туда кладется таблица, строки и т.д.? Потому что по логике чтения я могу предположить, что туда кладется сначала ключ, а сверху значение. Это следует из логики чтения: -2 ключ, -1 значение (что тоже какая-то хрень, но это еще как-то понять можно набухавшись). Но что если у меня таблица в таблице или плоские данные, типа строка / число? Документация не то чтобы объясняет это все.

Можно конечно забить и принять это как факт, а для себя сделать класс-обертку и забыть навсегда эти ужасы. Но стало уж очень принципиально понять, как это работает и что вообще происходит.
1. Не NULL а nil.  Чтобы выбрать  первый элемент таблицы.
------------------------
2.  -1,1 - выбор с разных концов стека.  
---------------------------
3. см документацию:  int lua_next (lua_State *L, int index);  Снимает ключ со стека, ложит пару ключ-значение из таблицы
Т е ключ функция сама убирает из стека, а значение убираем сами.
------------------------------
4. qLua - это библиотека функций. У нее нет стека.
Стек есть у виртуальной машины луа. qLua никаким боком не имеет отношение к этому.
-------------------
Не надо ничего предполагать или гадать, лучше прочитать:
https://web.archive.org/web/20230415092320/https://lua.org.ru/contents_ru.html
https://jevico.github.io/
https://eligovision.ru/media/upload/lua.pdf
Спасибо.

1. Не принципиально, суть поняли. Я на разных языках пишу, где-то NULL (что даже привычней мне), но это одно и то же.
2. Вот зачем и почему? Т.е. я не понимаю почему в одном случае мы читаем через 1, а в других через -1. От чего зависит? Ну т.е. есть какое-то правило по которым таблицы сверху всегда или что, почему таблицы обчитываются через отрицательные индексы сверху стека?
3. Это типа lua_next  снимает ключ, а мы через pop убираем остальное после чтения? Жесть какая-то, ну ладно.
4. Хорошо, допустим, но вот интересно как раз как это работает в Lua. Потому что у меня сложилось ощущение какого-то изврата. Хочу понять подробнее как оно работает
Вопрос по стеку Lua, стеку Lua и нюансы его чтения
 
1. Вопрос к знатокам: при работе со стеком, перед началом чтения через lua_next(L, -2), нам необходимо делать lua_pushnil(L). Зачем? Ведь это по сути означает "положить сверху NULL". Для чего мы это делаем?
2. Далее, почему в некоторых случаях мы читаем данные, как lua_tostring(L, -1). А в некоторых lua_tostring(L, 1). Если я правильно понимаю - это не одно и то же. В стеке из двух элементов индекс 1 - это низ стека, а -1 - верх стека!
3. Потом, для чего мы делаем lua_pop(L, 1); при использовании lua_next(L, -2), когда читаем стек? Ведь это удалит только один верхний элемент и все. Т.е., когда я читаю из стека некую таблицу - я должен посмотреть ключ (поле) по lua_next(L, -2) и, если он есть, то прочесть данные через lua_tostring(L, -1). Но потом я удаляю всего 1 элемент сверху. Не понимаю, что за дичь.
4. Есть у кого-то понимание / объяснение / картинка как выглядит стек qLua, когда в нем лежат смешанные данные? Т.е. как туда кладется таблица, строки и т.д.? Потому что по логике чтения я могу предположить, что туда кладется сначала ключ, а сверху значение. Это следует из логики чтения: -2 ключ, -1 значение (что тоже какая-то хрень, но это еще как-то понять можно набухавшись). Но что если у меня таблица в таблице или плоские данные, типа строка / число? Документация не то чтобы объясняет это все.

Можно конечно забить и принять это как факт, а для себя сделать класс-обертку и забыть навсегда эти ужасы. Но стало уж очень принципиально понять, как это работает и что вообще происходит.
Получить всю таблицу целиком, Получить всю таблицу целиком без цикла
 
Всем привет. Ест вариант получить всю таблицу целиком, не перебирая ее в цикле? В частности all_trades. Т.е. не получать кол-во записей, потом крутить в цикле и забирать по одной записи, а чтоб стразу ВСЕ записи одним методом. Есть такое или все по-старому - руками?
Индикаторы, Индикаторы и обезличенные сделки
 
Цитата
Nikolay написал:
getItem
Кстати, а это твоя репа?! Я вчера натыкался на нее. Если ты автор - приятно познакомиться )))
Индикаторы, Индикаторы и обезличенные сделки
 
Спасибо, господа. Коллбэк не обязателен, мне нужен был любой вариант для чтения. Спасибо, буду пробовать!
Индикаторы, Индикаторы и обезличенные сделки
 
Вопрос просто: как в индикаторе получить данные из таблицы обезличенных сделок? OnAllTrade, как я понимаю, в индикаторах недоступен. Переключить график на тики - НЕ подходит. Хочу именно программно в индикаторе получить доступ к данным.
Фризы и тормоза, Фризы терминала
 
Цитата
funduk написал:
Цитата
Виталий написал:
ЦП грузит до 15% максимум.
QUIK в одном потоке интерфейс держит, включая все таблицы, созданные не из юзерскриптов, и индикаторы. В 5800X 8 ядер, т.е. 12.5% загрузки всего проца значит полную загрузку ядра, на котором квик. Остальные Ваши 2.5% идут от других программ, или от юзерских скриптов в квике.
Основное, что мне помогло в ускорении квика, - это удаление старых свечей из archive/*.dat (чтобы на графиках и в datasource'ах не было много свечей), + уменьшение частоты обновления "Изменения биржевых параметров" до 3 сек с 1 сек + уменьшение количества графиков и индикаторов на них.
О, спасибо, учту этот момент. На самом деле это мне тоже пригодится немного в будущем
Фризы и тормоза, Фризы терминала
 
Цитата
nikolz написал:
Цитата
Виталий написал:
Добрый день. Подскажите, что сделать чтобы интерфейс не фризился и не тормозил? Я как бы все понимаю, но вот такое окно (приложил скрин) фризится, если программу разворачивать с панели или просто водить по графику курсором с перекрестием. При этом у меня железо как бы не микроволновка: AMD Ryzen 7 5800X 3.80 GHz, ОЗУ 64Гб DDR4 3200, NVME накопитель, пустой на половину. Видео RTX 3060. Ну неужели этого мало?! Ну елки-палки!
Что и где подкрутить, чтобы это прекратилось?!
покажите диспетчер задач.
картинки:
1)Производительность.
2)Процессы . Рабочее место ... QUIK
Это не поможет, там ничего интересно, я смотрел туда и даже профайлерами пытался поймать всплеск. Оператива там съедается не больше 2Гб обычно, я считаю это копейки от моего объема, т.к. у меня хром жрет 8-10Гиг. Общий объем озу всегда занят на уровне 40-50%, потому 64 себе и поставил. ЦП грузит до 15% максимум. Ну т.е. ничего критичного там нет. Видюху ваще смешно нагружает. Я думаю тут проблема в самом приложении, а именно в обработке данных. Посмотрю доку их, может пойму как устранить
Фризы и тормоза, Фризы терминала
 
Добрый день. Подскажите, что сделать чтобы интерфейс не фризился и не тормозил? Я как бы все понимаю, но вот такое окно (приложил скрин) фризится, если программу разворачивать с панели или просто водить по графику курсором с перекрестием. При этом у меня железо как бы не микроволновка: AMD Ryzen 7 5800X 3.80 GHz, ОЗУ 64Гб DDR4 3200, NVME накопитель, пустой на половину. Видео RTX 3060. Ну неужели этого мало?! Ну елки-палки!
Что и где подкрутить, чтобы это прекратилось?!
Утечка памяти, Происходит утечка памяти
 
Цитата
Игорь М написал:
Цитата
Виталий написал:
Вопрос к знающим и к поддержке: почему происходит утечка памяти? Версия Quik 8.10.1.1
Для информации: Проверил первый скрипт у себя на 8.7 и 8.8 - всё в порядке. Растет незначительными темпами, а затем сбрасывается. Если вставить collectgarbage ("step"), то совсем незначительные колебания (отклонение в 10% от 40КБ до 44КБ), а если collectgarbage () - не изменяется вообще.
Спасибо. Дело не в том значительно или нет. Понятно, что на машине с ОЗУ 14Гб этого не будет заметно. Тем более на моих 32Гб ОЗУ. Но тут сама суть, что есть утечка, а быть ее не должно. Про сборщик мусора посмотрю сейчас чего это и как внедрить.
Утечка памяти, Происходит утечка памяти
 
Вопрос к знающим и к поддержке: почему происходит утечка памяти? Версия Quik 8.10.1.1

Ниже привожу коды скриптов. С первым память утекает просто моментально. Со вторым меньше и не так резво, но утечка все равно есть.
Код
is_run = true

function main()
  while is_run do
    local dt = os.date("!*t", os.time())
    sleep(500)
  end
end

function OnStop()
  is_run=false
end

Второй скрипт, утечка меньше, но имеется (нужно запустить и подождать минут 5, запомнив изначальное значение выделенной памяти)
Код
is_run = true

function main()
  while is_run do
    local curHour = tonumber(os.date("%H", os.time()))
    local curMin = tonumber(os.date("%M", os.time())) -- %S - сек
    local curDay = tonumber(os.date("%w", os.time())) -- диапазон, 0-6, соответствует Sunday-Saturday
    local year = tonumber(os.date("%Y", os.time()))
    local month = tonumber(os.date("%m", os.time()))
    local day = tonumber(os.date("%d", os.time()))
    sleep(500)
  end
end

function OnStop()
  is_run=false
end

Сразу поясню: эти два скрипта в таком виде НЕ несут смысловой нагрузки. Они являются лишь частью рабочего скрипта. Но именно этот код вызывает утечку. Посмотреть это можно открыв окно "Доступные скрипты" и наблюдать за колонкой "Память, KB". Для первого скрипта она будет расти, как бешеная сразу после запуска. Для второго не так сильно и куда медленнее, но расти будет.

Собственно, вопрос: че происходит?! Т.е. даже если нет сборщика мусора - это ведь не повод жрать память бесконтрольно! К слову сказать, обнуление переменных с помощью "х = nil" - не помогает! Использование глобальных переменных вместо local так же не помjгает! Отсюда вопрос: че за дичь?!
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
Владимир написал:
Виталий, Господи, я прекрасно понимаю, что интерпретируемый язык на 1-2 порядка медленнее. Но кому нужен ТАКОЙ код? Нормальные алгоритмы торговли времени почти не требуют.

Насчёт "есть логика, которую банально удобнее и проще реализовывать на иных языках" - вообще-то, согласен: меня в своё время дико раздражало отсутствие типа integer и булевых операций. Но вот зачем "lua отдает данные во внешку" - это выше моего понимания! ::

Насколько я вижу по этому форуму, проблемы с переходом на новую версию возникают как раз не у тех, кто пишет на lua (кстати, есть тут такие, кроме меня?), а как раз у "альтернативщиков". А чего "чинить логику"? Во всех языках чуть не самая стабильная конструкция как раз if-then-else. Я и писал на lua, и других агитировал это делать как раз под этим самым лозунгом: "Меньше шансов, что в очередное "полезное" обновление что-то отвалится".

Да, я именно "логами и мессагами" и отлаживался. А "удобным отладчиком" не пользуюсь вот уже лет 30 - с тех пор, как нарвался, что в сложных случаях глючит как раз пошаговый отладчик.

Ну да, в Lua у нас таблицы, причём безобразно сделанные и глючащие. А что ещё нужно, кроме "примитивных ячеек и кликов по ним"? Ну, горячих клавиш пара-тройка. У меня одна таблица информационная (динамически обновляемая, имеющая три режима выдачи), а вторая - контекстное меню для каждой строки первой таблицы! Накидать его можно... ну, не за секунды, а за пару часов. Накидал и забыл! Много дней у меня уж работает этот диалог, и он меня ПОЛНОСТЬЮ устраивает! Всё, у меня диалог ГОТОВ! Написан и забыт. Остались небольшие проблемы с этими долбаными прерываниями, которые тут приходят целой колодой, да ещё вразнобой. Ну и шлифовка своих алгоритмов - всю эту неделю скрипт торгует в автоматическом режиме, а я за ним присматриваю и пытаюсь понять: лучше меня он торгует или хуже. Результат явно не в мою пользу, так что даже и не знаю, что там ещё улучшать. ::  
Дык на Lua вроде писал и были траблы. Уже не вспомню с чем, вроде не сильно серьезные, но как раз на отладку и понимание что они там наменяли, что у меня полетело и ушло больше времени. Интерфейс на таблицах, ну да, была у меня наработка тоже. Типа написал и юзаешь. Да вот только ограничений много все равно. Покрасить хотя бы ячейки в разные цвета - 100500 строк кода, хоть и "написал и забыл", но в другом языке это быстрее в разы. Опять же, есть уверенность, что в следующей версии они как раз до таблиц не доберутся? Да так наменяют, что весь интерфейс посыпется? )) Каждому свое. Если есть алгоритм, который можно воспроизвести на LUA - дык и хорошо. Говорю же, простые вещи я на нем и делал, году с 2015. Тогда тоже крутил, вертел и в итоге сели на LUA делать. И да, с тех пор пара скриптов так и вертится. Тот же простейший журнал сделок. 5 лет без сбоев и работал, сделки сохранял везде и всегда и помогал неоднократно, даже пару раз в спорах с брокером по поводу коммисов ) Но как бы так ведь можно было бы и до сих пор на DOS каком-нибудь сидеть. Прогресс он же прогрессирует, надо щупать новые подходы тоже ))
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
Александр написал:
Виталий,
Вам дали путь решения вашей проблемы, а вы вместо задавания вопросов, начинаете выступать, так не буду, сяк не буду. У вас проблемы вы ее и решайте. Информации больше, чем достаточно. Вопрос заключается в том, чтобы вызвать из неуправляемой среды управляемый код? Луа и QLua тут не причем.
Примерный путь решения описан так.
Код
    unk : =   nil ;
  OleCheck(CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, unk));
  FMetaHost : =  unk as ICLRMetaHost;
  unk : =   nil ;
  OleCheck( FMetaHost.GetRuntime (PWideChar(AClrVer), IID_ICLRRuntimeInfo, unk));
  FRuntimeInfo : =  unk as ICLRRuntimeInfo;
   FRunTimeInfo.SetDefaultStartupFlags (GetLoaderFlags(ConcurrentGC, LoaderFlags),  nil ); //Установим загрузочные флаги
  OleCheck( FRuntimeInfo.IsLoadable (isLoaded)); //Проверяем на загружена ли сборка
   if   not  isLoaded  then 
    raise  EOleError.CreateFmt (ECRLNotLoaded, [AClrVer]);
  unk : =   nil ;
  OleCheck( FRuntimeInfo.GetInterface (CLASS_CorRuntimeHost, IID_ICorRuntimeHost, unk));
  FDefaultInterface : =  unk as ICorRuntimeHost;
  FDefaultInterface.Start;
  iDomain : =  iHost.DefaultAppDomain;
  RawAssembly : =  LoadAssemble( 'TestCrl.dll' ); //Загрузка сборки в VarArray
   & type : =   iAssm.GetType_2 (typeName); //Получаем тип класса
  ov : =   &  type.InvokeMember_3 ( 'ctor' , BindingFlags_CreateInstance,  nil , null,  nil ); //Создаем класс
   if  VarSupports(ov, ITest, test)  then  //Получаем интерфейс
     test.ShowMessage ( 'Hi World' );  //Вызываем функцию интерфейса
   ..  .. 
  //Обнуляем интерфейсы
  
Более ничем помочь не могу.
Дык я еще за прошлые примеры сказал спасибо. И за этот тоже. Я не выступаю, я думаю на будущее и как разраб, а не кодер )) Кодер он ведь задачу в лоб решает. Ему сказали - он и кодит. И не важно, что есть решение проще и быстрее (а может оно же и лучше). Он тупо решает че сказали. Я так не умею (уже, раньше делал). Я ищу правильное решение, с которым потом страдать не придется. На данный момент, как и писал ранее, кажется нашел. Будем тестить и смотреть. За примеры еще раз спасибо.
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
Владимир написал:
Виталий, Вот режь меня, жги меня - НЕ ПОНИМАЮ, зачем здесь более быстрый язык! У меня и весь диалог, и вся индикация, и весь обмен с сервером написан на чистом Lua, и скрипт большую часть времени просто спит! Держит при этом несколько десятков тикеров (моделировал пару тысяч - разницы по скорости вообще не заметил). Свечи считаю сам (по десятку разных временных периодов), стоп-лоссы отслеживаю сам - НУ ЧТО тут может отжирать время, НУ ЧТО? О какой-никакой стабильности можно говорить как раз относительно Lua - дерьмо, конечно, но стабильное. А уж если тут определяют номера версий софта, настраиваются на них - какая тут может быть стабильность?
Резать и жечь не буду, а вот пояснить смогу )) Код, типа такого
Код
function summ()
   for i = 1, 100000000 do
        r = i + i;
    end
end
Момент 1: на Lua будет выполняться порядка 1.3-1.4 сек, а в с++ примерно 0.2 сек. Я думаю, разница очевидна. Я лично проводил замеры, это не байка из тырнету. У меня до сих пор лежит этот код в примерах с замерами на lua и c++. Зачем такое в реальной жизни - хз, но по моему операция очень простая и мне неясно чего lua так долго с ней возится. Я даже сообщений никаких не вывожу, просто операция сложения. Но это далеко не все. Есть логика, которую банально удобнее и проще реализовывать на иных языках. Т.е., lua отдает данные во внешку, там происходит магия (быстрая и/или такая, на которую lua не способен) - в lua подается команда (не данные обратно, а именно команда) на сделку. Я же говорю: простой робот-торгаш - у меня таких полно и они именно на lua! Тут всего хватает, естественно. Но если мы говорим о более продвинутых вещах - ну можно извращаться на Lua, но зачем, если есть более заточенные для этого вещи.

Момент2: с переходом на новую версию квик и lua, как следствие, перестали у меня работать некоторые скрипты. Че будет в будущем - хз, но чинить сидеть всю логику потом с убогой отладкой - то еще удовольствие. А так, меньше шенсов, что в очередное "полезное" обновление что-то отвалится. Ну или чинить меньше придется

Момент 3: Собственно, отладка. Можно и логи писать, а потом их разбирать. Можно и мессаги выводить - не вопрос. Но проще же использовать удобный отладчик пошаговый )

Момент 4: Интерфейс. В Lua чего у нас? Таблицы. Одно дело, если хочется, но другое, если надо. Надо сделать что-то более серьезное, чем примитивные ячейки и клик по ней для действия. Да и в целом, сидеть выписывать интерфейс, когда его можно мышью накидать за секунды - это как писать мобильное приложение на React Native (выверстывая каждый элемент и потом страдая на разных экранах) вместо того, чтобы писать сразу на Kotlin в удобной студии, где верстка макета займет в прямом смысле пару минут и будет работать сразу везде одинаково и хорошо. Это вряд ли для Вас аргумент, но для меня очень даже.
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
Владимир написал:
Александр, Лапуль, я уже говорил, что с раннего детства терпеть не могу распальцованных дураков. Гнутых пальцев я тут уже видел выше крыши, а программистов - полтора человека, и уж Вы никоим образом к ним не относитесь. Так что НЕ ВАМ что-то тут вякать про "пора менять работу".   И говорил уже тыщу раз: задачи организации торговли настолько элементарны, что решаются ЛЮБЫМ способом. В частности, на чистом Lua, без всего этого маразма с обилием языков, библиотек, версий и прочей лабуды.
Пока была возможность - решал на Lua. Теперь задачи поменялись немного и понадобился более стабильный, быстрый и подходящий язык. Либо C++ либо C#. Т.е. в любом случае это пока скорее эксперимент и я перебираю всевозможные варианты
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
Александр написал:
Цитата
Виталий написал:
Смотрел, не понял, как это сделать и куда всунуть чего в моей либе сишной. Да и есть ли смысл, уже не знаю даже. Лучше, наверное, все-таки делить ответственность: логика на C++, интерфейс на C#. За примеры спасибо, изучу, вероятно применю что-то в будущем.
Если вы у вас опыт работы 10+ лет и вы не можете связать 3 интерфейса, чтобы запустить сборку и вас забанили в гугле.
То вам пора менять работу.
По какому принципу сделан такой вывод? Как знание конкретной технологии или конкретного языка связано с опытом в области разработки?! Я не хочу развозить срач, как у вас тут с другим оратором вышло, но перед тем как давать такие громкие (кому-то, может даже, обидные) советы - надо хотя бы подумать )) Я нигде не писал, что 10 лет разработку веду на сях или на шарпее или упаси Бог на лунтике. Опыт по бОльшей части у меня в веб - от php до JS (React JS / Native). На шарпее лет 8 прикладного опыта по windows forms. Крестить никогда мне ничего не приходилось и не нужно было, если что. Так что Ваш совет это как сказать электрику по ремонту станков и оборудования типа "че, не можешь в автоэлектрике разобраться или автозвук подключить?! Тогда меняй работу". Ну или предъявить инженеру с автоваза, что он не может самолет спроектировать. Оно же ведь одно и тоже, сиди да черти себе ))) А гугл Ваш, кстати, не поможет, если там с подобной проблемой еще никого не было. Как правило, люди крестят Lua и C++, но не QLua. И как я понял исходя даже из этого форума - это немного разные вещи.
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
Александр написал:
Тут читать   https://miac.volmed.org.ru/wiki/index.php/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D­ ­0%...  
ExportDLL брать тут  https://yadi.sk/d/qAlXi-OnjniSt
Там есть опечатки и битые ссылки, в той статье. Она Ваша?
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
Александр написал:
ир
Там есть опечатки и битые ссылки, в той статье. Она Ваша?
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
Александр написал:
Цитата
swerg написал:
Фига себе!
Александр , спасибо вам большое!!
Сложно это все, проще через CLRCreateInstance, ICLRMetaHost, ICLRRuntimeInfo, ICorRuntimeHost
Смотрел, не понял, как это сделать и куда всунуть чего в моей либе сишной. Да и есть ли смысл, уже не знаю даже. Лучше, наверное, все-таки делить ответственность: логика на C++, интерфейс на C#. За примеры спасибо, изучу, вероятно применю что-то в будущем.
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
Александр написал:
Цитата
Виталий написал:
 
Цитата
Александр  написал:
 
Цитата
 Виталий   написал:
   
Цитата
  Александр    написал:
   
Цитата
   Виталий     написал:
     
Цитата
    swerg      написал:
     
Цитата
     Виталий       написал:
И что не так? В этой либе мне нужно использовать CLR, там будут формы. Как сам факт поддержки CLR (без каких-либо вызовов) влияет на выгрузку библиотеки?
     
Как минимум - вот оно коренное отличие вашей DLL от моей, а вовсе не версия QUIK.
Ну и видимо передавайте привет .NET и особенностям ее работы.

     
Цитата
     Виталий       написал:
(без каких-либо вызовов) влияет на выгрузку библиотеки?
     
Вы может и не вызываете, но раз хотите .NET - оно там очень могуче напрягается, чтобы вам его предоставить.
Вам наверное будет не сложно пока отключить использование .NET и проверить.
     Пока не сложно. Проверил. Без NET выгружается. Другой вопрос: как обеспечить выгрузку с NET, не знаете? Полагаю, спрашивать разрабов квика бесполезно про это...
    Способов подключения сборок на си++ как минимум 2: 1. это использовать управляемый код. 2. Использовать интерфейсы и самостоятельно загружать сборки.
Тот и другой способ гуглится.
Но возможно стоит начать вот CoInitializeEx и CoUninitialize.
Но я бы советовал сделать отдельное приложение на .net и передавать туда данные, например по сети.
   Не, приложение с передачей данных это такое себе. Это как C# приложение с коннектором C++ - древняя тема и такая же нестабильная. Я пробовал ее году в 2015 еще, че-то не зашло. Я тогда ушел на LUA чистый и его хватало. Сейчас появилась потребность в более нормальном языке, чем LUA и я нашел вариант с подключением библиотеки. Я продолжил бы писать на C# (его знаю, а С++ нет), но проблема в том, что на шарпе нет нормального способа сделать либу. Есть какой-то полукостыльный и он мне не понравился и результат сомнительный. Интерфейсы на чистом Win API тоже не осилил как-то. Вот прикрутил CLR, но оно вон че оказалось. Буду еще смотреть, что дальше делать, но куча посредников между биржей и моим алгоритмом - это печаль и зло. Хочу поменьше, чтоб стабильнее и быстрее было.
  Сделай секцию экспорта в C# библиотеке: сначала дезасемблировать, потом прописывать флаги и секции. Я специально программу написал, которая такое делает.
И можно использовать LoadLibrary на стороне луа и все другие вкусняшки.
 Вообще не понял. Как я читал, у C# проблема с экспортом функций и чтобы они были доступны - нужно ставить какую-то приблуду, которая работает только в английской локали. Ты про это или про что-то другое говоришь?
В С# проблема с экспортом функций в том, что MS не хочет ее реализовывать. Практических проблем нет.
Ставить приблуду не обязательно. Надо:
1. ildasm.exe декомпилировать код.
2. В тексте кода найти все нужные функции и вставить .export[{номер функции}]. Можно использовать ObfuscationAttribute для определения нужных функций.
3. ilasm.exe скопилировать код в бинарник.
В 64 битном режиме поправить установить флаг .corflags 0x00000002
Утилиту которая такое делает можно написать за один вечер.
Читай книгу Serge Lidin ".Net IL Assembler"
Спасибо, но на самом деле так можно и закопаться очень глубоко и забыть вообще что ты и зачем хотел сделать изначально )) Я действующий разраб по основной профессии, опыта уже 10+ лет. И вот именно этот опыт подсказывает мне идти по пути наименьшего сопротивления. Ибо если ты не можешь сделать сегодня то, что будет работать хоть как-нибудь - завтра это сделает другой. А ты так и будешь дальше сидеть и пилить идеальный код и решение , которое к моменту появления уже нафиг некому не нужно. Я занимался подобными вещами, как Вы описываете, когда пытался защитить от взлома программу на C#. И, скажу, довольно удачно. Метод был простой, как помидор: обфускация, упаковка и подмена парочки байт, чтобы обратно никто не распаковал. Все, не надо платить 100500 мильенов за дорогие защиты от вскрытия. Информацию сохраню, займусь как-нибудь потом. А пока время реализовывать идею. Вроде как, нашел рещение и оно даже мне подходит (не такое плохое).
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
Александр написал:
Цитата
Виталий написал:
 
Цитата
Александр  написал:
 
Цитата
 Виталий   написал:
   
Цитата
  swerg    написал:
   
Цитата
   Виталий     написал:
И что не так? В этой либе мне нужно использовать CLR, там будут формы. Как сам факт поддержки CLR (без каких-либо вызовов) влияет на выгрузку библиотеки?
   
Как минимум - вот оно коренное отличие вашей DLL от моей, а вовсе не версия QUIK.
Ну и видимо передавайте привет .NET и особенностям ее работы.

   
Цитата
   Виталий     написал:
(без каких-либо вызовов) влияет на выгрузку библиотеки?
   
Вы может и не вызываете, но раз хотите .NET - оно там очень могуче напрягается, чтобы вам его предоставить.
Вам наверное будет не сложно пока отключить использование .NET и проверить.
   Пока не сложно. Проверил. Без NET выгружается. Другой вопрос: как обеспечить выгрузку с NET, не знаете? Полагаю, спрашивать разрабов квика бесполезно про это...
  Способов подключения сборок на си++ как минимум 2: 1. это использовать управляемый код. 2. Использовать интерфейсы и самостоятельно загружать сборки.
Тот и другой способ гуглится.
Но возможно стоит начать вот CoInitializeEx и CoUninitialize.
Но я бы советовал сделать отдельное приложение на .net и передавать туда данные, например по сети.
 Не, приложение с передачей данных это такое себе. Это как C# приложение с коннектором C++ - древняя тема и такая же нестабильная. Я пробовал ее году в 2015 еще, че-то не зашло. Я тогда ушел на LUA чистый и его хватало. Сейчас появилась потребность в более нормальном языке, чем LUA и я нашел вариант с подключением библиотеки. Я продолжил бы писать на C# (его знаю, а С++ нет), но проблема в том, что на шарпе нет нормального способа сделать либу. Есть какой-то полукостыльный и он мне не понравился и результат сомнительный. Интерфейсы на чистом Win API тоже не осилил как-то. Вот прикрутил CLR, но оно вон че оказалось. Буду еще смотреть, что дальше делать, но куча посредников между биржей и моим алгоритмом - это печаль и зло. Хочу поменьше, чтоб стабильнее и быстрее было.
Сделай секцию экспорта в C# библиотеке: сначала дезасемблировать, потом прописывать флаги и секции. Я специально программу написал, которая такое делает.
И можно использовать LoadLibrary на стороне луа и все другие вкусняшки.
Вообще не понял. Как я читал, у C# проблема с экспортом функций и чтобы они были доступны - нужно ставить какую-то приблуду, которая работает только в английской локали. Ты про это или про что-то другое говоришь?
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
Александр написал:
Виталий, По первому способу
https://www.codeproject.com/Articles/35041/Mixing-NET-and-native-code
https://docs.microsoft.com/ru-ru/cpp/dotnet/mixed-native-and-managed-assemblies?view=msvc-160
Че-то щас так посмотрел и печально все это как-то. Может Вы и правы в том, что отдельно софтину написать на шарпе и через C++ прокидывать туда данные. Надо подумать, попробовать, потыкать
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
Александр написал:
Цитата
Виталий написал:
 
Цитата
swerg  написал:
 
Цитата
 Виталий   написал:
И что не так? В этой либе мне нужно использовать CLR, там будут формы. Как сам факт поддержки CLR (без каких-либо вызовов) влияет на выгрузку библиотеки?
 
Как минимум - вот оно коренное отличие вашей DLL от моей, а вовсе не версия QUIK.
Ну и видимо передавайте привет .NET и особенностям ее работы.

 
Цитата
 Виталий   написал:
(без каких-либо вызовов) влияет на выгрузку библиотеки?
 
Вы может и не вызываете, но раз хотите .NET - оно там очень могуче напрягается, чтобы вам его предоставить.
Вам наверное будет не сложно пока отключить использование .NET и проверить.
 Пока не сложно. Проверил. Без NET выгружается. Другой вопрос: как обеспечить выгрузку с NET, не знаете? Полагаю, спрашивать разрабов квика бесполезно про это...
Способов подключения сборок на си++ как минимум 2: 1. это использовать управляемый код. 2. Использовать интерфейсы и самостоятельно загружать сборки.
Тот и другой способ гуглится.
Но возможно стоит начать вот CoInitializeEx и CoUninitialize.
Но я бы советовал сделать отдельное приложение на .net и передавать туда данные, например по сети.
Не, приложение с передачей данных это такое себе. Это как C# приложение с коннектором C++ - древняя тема и такая же нестабильная. Я пробовал ее году в 2015 еще, че-то не зашло. Я тогда ушел на LUA чистый и его хватало. Сейчас появилась потребность в более нормальном языке, чем LUA и я нашел вариант с подключением библиотеки. Я продолжил бы писать на C# (его знаю, а С++ нет), но проблема в том, что на шарпе нет нормального способа сделать либу. Есть какой-то полукостыльный и он мне не понравился и результат сомнительный. Интерфейсы на чистом Win API тоже не осилил как-то. Вот прикрутил CLR, но оно вон че оказалось. Буду еще смотреть, что дальше делать, но куча посредников между биржей и моим алгоритмом - это печаль и зло. Хочу поменьше, чтоб стабильнее и быстрее было.
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
Владимир написал:
Виталий, Аналогов этому терминалу нет и не будет. Ибо задачи разработчиков диаметрально противоположны задачам пользователей: им не нужна стабильно работающая версия, им нужен непрерывный апдейт для имитации бурной деятельности. Алгоритмически задача торговли тупа до неприличия: есть какие-то курсы, которые либо растут, либо падают, либо стоят на месте, И ВСЁ - больше здесь нифига нет! Ну, кое-какие проблемы с передачей данных - деньги всё-таки, "безопасность", панимаш! А вот если туда впендюрить и DLL, и ОС, и .NET, всё это хорошенько палкой перемешать, изуродовать язык со страшной силой... тогда разработчикам будет обеспечен фронт работ на долгие годы.  ::  
Тта эт понятно. Про аналоги, кстати, хз. Ведь есть MT5, который поддерживают некоторые брокеры. Просто странна вся эта ситуация, монополия какая-то.
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
Anton написал:
Цитата
Виталий написал:
Как сам факт поддержки CLR (без каких-либо вызовов) влияет на выгрузку библиотеки?
Влияет так, что загрузчик, видя clr в загружаемом модуле, загружает дотнет, и дальнейшим циклом жизни модуля управляет уже дотнет. Квик ни сном ни духом не ведает, что в него вперли аппдомен и его надо прибивать, соответственно никто его и не прибивает, соответственно длл выгружена не будет.
Ок, разобрались. Проверил, без NET выгружает. Какие есть варианты самому сделать выгрузку или заставить выгружаться DLL c NET?
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
swerg написал:
Цитата
Виталий написал:
И что не так? В этой либе мне нужно использовать CLR, там будут формы. Как сам факт поддержки CLR (без каких-либо вызовов) влияет на выгрузку библиотеки?

Как минимум - вот оно коренное отличие вашей DLL от моей, а вовсе не версия QUIK.
Ну и видимо передавайте привет .NET и особенностям ее работы.

Цитата
Виталий написал:
(без каких-либо вызовов) влияет на выгрузку библиотеки?

Вы может и не вызываете, но раз хотите .NET - оно там очень могуче напрягается, чтобы вам его предоставить.
Вам наверное будет не сложно пока отключить использование .NET и проверить.
Пока не сложно. Проверил. Без NET выгружается. Другой вопрос: как обеспечить выгрузку с NET, не знаете? Полагаю, спрашивать разрабов квика бесполезно про это...
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
Владимир написал:
Виталий, Так ведь хрень вполне себе стейбл!  ::  
Ну, в целом да. Хрень в квике - стейбл. Жаль, аналогов этому терминалу нет. Финам че-то пыдился, но что-то сильнее, чем мобильное приложение - не вышло у них, а жаль.
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
Anton написал:
Цитата
Виталий написал:
Собственно, самое важное - коды
Вот да, это самое важное было.
Код
   < CLRSupport >  true  < /CLRSupport >   
вместо тысячи слов.
И что не так? В этой либе мне нужно использовать CLR, там будут формы. Как сам факт поддержки CLR (без каких-либо вызовов) влияет на выгрузку библиотеки?
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
swerg написал:
Цитата
Виталий написал:
Но повторю еще раз: версия квика у вас не та. У меня 8.10.1.1 - они могут отличаться. Чего я не понимаю, так это почему молчат представители поддержки официальной?! Их как-то нужно призывать по особому в тему?? По мне так уже давно могли бы что-то написать.

И? Я не знаю зачем вы используете именно эту версию.
Вам ничего не мешает быстро проверить на 8.9

Цитата
Виталий написал:
Чего я не понимаю, так это почему молчат представители поддержки официальной?! Их как-то нужно призывать по особому в тему?? По мне так уже давно могли бы что-то написать.

Выгрузка / не выгрузка DLL - это последнее, что заботит реальных пользователей торгового терминала, даже если они используют какие-то готовые библиотеки. Так что, по-моему, это "проблема" приоритета из нижней десятки всех тех тысяч реальных проблем, которые есть в QUIK.
Я использую эту версию, потому что мне ее предоставил брокер. Другой у брокера нет. Какая-то древняя только. С другой стороны, можно задать такой же вопрос разрабам (полагаю, они ее предоставили боркеру): зачем распространять сырую-косую версию?! Т.е. как бы я полагаю, что если обновление пришло и оно не помечено альфой или бетой - значит оно стейбл. А на деле оказывайтся хрень какая-то.
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
swerg написал:
Ровно такой же скрипт сделал у себя для тестов
У меня DLL выгружается (QUIK 8.9) - после запуска и остановки скрипта могу DLL удалять, заново переписывать и т.д. (проверяю просто переписыванием поверх, буквально VS не собирает на то место, откуда запуск)
Но проверяю на другом коде DLL.
Если дойдёт руки - попробую буквально вашу DLL собрать
Спасибо, конечно. Будет интересно узнать результаты. Но повторю еще раз: версия квика у вас не та. У меня 8.10.1.1 - они могут отличаться. Чего я не понимаю, так это почему молчат представители поддержки официальной?! Их как-то нужно призывать по особому в тему?? По мне так уже давно могли бы что-то написать.
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Код
path = getScriptPath() .. "\\central-core.dll"
package.loadlib(path, "luaopen_central_core")()

local m = central_core.DoSomething();
message(tostring(m))

isRun = true

function main()
    while (isRun) do
        sleep(100)
    end
end

function OnStop()
   isRun = false
end
Теперь код верный? Если да, то все на что он повлиял - треугольник зеленый стал быстрее сменяться на красный квадрат. Т.е. быстрее стал останавливаться. Либа по-прежнему НЕ освобождается.
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Вы имеете ввиду, что нужна обработка флага в OnStop?! Если да, то мне тогда непонятно что делает кнопка "Стоп" в квике, просто меняет зеленый треугольник на красный квадрат?! Обработку в OnStop сейчас проверю.
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Собственно, самое важное - коды https://github.com/alik1241/lua-cpp-test Как приложить архив - не нашел.
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
И так, провел тесты. Вот результаты:
1. Коды из репозитория https://github.com/swerg/simple-lua-c-dll воотбще никак не завелись ни под каким соусом и возиться с причинами я не стал
2. Свои коды я прикладываю в архиве. Результат, как и писал ранее - НЕ выгружается либа после остановки скрипта

Описание
В папка x64 лежит откомпиленая либа + стартер на LUA для нее. Либа посылает в LUA строчку "Привет из DLL". Нит никакого кода, который может вызвать ошибку в DLL, после которого она каким-то образом заклинит и будет невозможно ее выгрузить. Код внутри DLL отрабатывает КОРРЕКТНО! Если кто-то сомневается - исходники приложены, можете открыть, вычистить папку x64 и скомпилить заново. Проект настроен таким образом, что у вас откомпилится DLL + рядом ляжет стартер на LUA.

Что я делаю
Запускаю скрипт и DLL прямиком из этой папки x64. После того, как вижу сообщение - останавливаю скрипт. Меняю что-нибудь незначительное, но достаточное для повторной компиляции в коде С++. Например, удаляю строку отступа или добавляю ее. Жму F5. Возникает ошибка Ошибка LNK1104 не удается открыть файл. Она означает ровно следующее: квик НЕ освободил DLL!

Вниманием!
Если просто нажать F5 не меняя код C++ в студии - ошибок не будет и может показаться, что DLL откомпилилась. Но это не так! У вас просто запустилась откомпиленная DLL (попыталась запуститься). Такая проверка не имеет смысла! Предупреждаю, вдруг кто до сих пон не знал/не понимал как это работает и думал, что все ок.

Очень интересно будет услышать мнение на этот счет от разрабов квика. Версия текущая 8.10.1.1
Надеюсь, теперь информации более, чем достаточно и вопросов/недоверия более не возникнет

Комментарии по моему коду принимаются и приветствуются!!!
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
Старатель написал:
Цитата
Виталий написал:
Код
    Critical error ACCESS_VIOLATION   in   script 
    

https://forum.quik.ru/messages/forum1/message50121/topic5947/#message50121
ясно, короче походу из одного места растут ноги. Я все равно еще позднее проверю репу, что тут давали, но почему-то мне кажется что это одна и та же ошибка.
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
swerg написал:
Цитата
Виталий написал:
Второй момент, вы не описываете поведение в 8.10.

На ftp arqa нет этой версии. Я не знаю где вы её взяли, поверить возможности нет.
я не качаю нгичего на ftp. Я вхожу в квик и жму "Проверить файлы". Эта версия пришла с очередным апдейтом. Так что я хз че там за фтп и что на него кладут. Я доверяю апдейтам через меню )
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
swerg написал:
Цитата
Виталий написал:
Только не говорите, что еще нужен код библиотеки, чтобы уверовать в некорректность выгрузки    

Во-первых, безусловно нужен. Про него вас и спрашивали изначально.

Во-вторых, я проверил на простейшей библиотеке
https://github.com/swerg/simple-lua-c-dll

на простейшем скрипте с использованием этой библиотеки:
luacdll = require("luacdll")
message(tostring(luacdll.GetCurrentThreadId()), 1)

QUIK 8.6 -- после того, как скрипт отработал - dll-файл библиотеки остаётся заблокированным, т.е. dll не выгружена корректно.
QUIK 8.9 -- после того, как скрипт отработал - dll-файл библиотеки НЕ остаётся заблокированным, т.е. dll выгружена корректно, dll-файл с библиотекой можно переписать / удалить, не закрывая QUIK.
Первый момент: Вы будете удивлены, но именно этой репой я пользовался при создании своей DLL изначально. Второй момент, вы не описываете поведение в 8.10. Вполне возможно, что в нее могли вернуться баги из 8.6 - это обычная практика в большой команде на большом проекте. Третий момент: я проверю сегодня Ваш пример на 8.10, упрощу донельзя свой и тоже проверю. Результаты напишу сюда позднее и, вероятно, приложу свои коды. Тема заведена не срача ради, а во имя стабилизации и без того не очень ровного терминала.
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
В DLL ошибки нет, т.к. даже с более примитивным кодом типа отправки в LUA скрипт "Привет, мир!" - выгрузка не происходит. Впрочем, чтение из файла происходит успешно. Подозреваю, что и в показанном коде, стало быть, ошибок нет иначе свалилось бы. Кстати говоря, если есть ошибка в dll, насколько припоминаю, квик вывалит ошибку и захлопнется. Разве нет?
Quik 8.5 не освобождается память
 
Цитата
Evgeniy Karnaukhov написал:
Цитата
Anton написал:
 
Цитата
Sergey Gorokhov  написал:
Можете привести пример кода на котором проблема воспроизводится?
 Да, конечно. Проверил еще раз на 8.6.0.97 только что, все как было, запускаем - получаем просто ошибку, запускаем повторно - получаем сначала все финализаторы, потом ошибку.
 
Код
      local   run   =     true  

  -- global table  
tgl   =   {}
setmetatable(tgl, { __gc   =     function  ()   message  (  "global __gc"  )   end   })

  -- chunk-level table  
  local   tcl   =   {}
setmetatable(tcl, { __gc   =     function  ()   message  (  "chunk-level __gc"  )   end   })

  function    OnStop ()
   run   =     false  
  end  

  function    OnInit ()
     -- function-level table  
     local   tfl   =   {}
   setmetatable(tfl, { __gc   =     function  ()   message  (  "function-level __gc"  )   end   })
     do  
        -- block-level table  
        local   tbl   =   {}
      setmetatable(tbl, { __gc   =     function  ()   message  (  "block-level __gc"  )   end   })
        -- now raise an error  
      error(  "error from OnInit"  )
     end  
  end  

  function    main ()
     while   run   do  
        sleep  (  1000  )
     end  
  end  
    
 

Добрый день,
Описанная в данном инциденте ошибка была исправлена в версии 8.7.1 терминала QUIK. Рекомендуем вам обновить версию программы.

Приносим извинения за причиненные неудобства.
Видимо, не была или была не полностью. Вот описание https://forum.quik.ru/messages/forum10/message50829/topic6030/#message50829
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Если вдруг так сильно принципиально видеть код загрузки (хотя он стандартный и бородатый), то вот:
Код
path = getScriptPath() .. "\\my_lib.dll"
package.loadlib(path, "luaopen_my_lib")()
Только не говорите, что еще нужен код библиотеки, чтобы уверовать в некорректность выгрузки  :lol:  
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Цитата
Anton написал:
Цитата
Виталий написал:
Код по высвобождению
Вы б лучше код загрузки показали. Про 8.10 ничего пока не могу сказать, но в предыдущих все ок с выгрузкой, это где-то накосячено.
Во-первых, ситуация описана очень подробно и не вижу смысла в еще каких-то кодах. Во-вторых, Старатель в комменте выше предоставил исчерпывающий пример, если моих кодов мало. Так что это не у меня накосячено, это выгрузка не работает нифига.
Некорректная выгрузка DLL при завершении скрипта, Некорректная выгрузка DLL при завершении скрипта
 
Нашел всего две темы про выгрузки DLL в скрипте и те какие-то странные, неполные что ли.
Суть проблемы: квик версии 8.10.1.1. После остановки скрипта, в котором подключена DLL (на С++!) - библиотека НЕ освобождается!
Код по высвобождению видел:
Код
  package.loaded[m] = nil
  _G[m] = nil
Не помогает! Как кто-то верно заметил - сама библиотека НЕ освобождается! Причем это действительно и для C++, поэтому я вверху указал на чем либа написана.

Как выявил:
1. Имеется либа на С++ с методом
Код
    string line;
    string outLine;
    const char* S;

    ifstream in("read_test.txt");

    if (in.is_open())
    {
        while (getline(in, line))
        {
            outLine += line;
        }
    }

    in.close();
    lua_pushstring(L, outLine.c_str());

    return(1);
Файл 100% есть, ошибок - нет! Если в LUA вызвать этот метод - он выполняется. Дальше я останавливаю скрипт и пытаюсь перекомпилить либу и получаю отказ в доступе. Пока не перезапущу квик - не компилит.

2. Имеется бородатый lua_quik_resources.dll и скрипт автологина, который давно всем известен (полагаю). Если запускаем квик с запущенным скриптом автологина и остановим его, а потом попытаемся запустить не закрывая квик, то получим:
сначала
Код
Critical error ACCESS_VIOLATION in script 
А если после этого еще раз попытаться, то вообще намертво виснет квик и не оживает, пока аварийно не завершишь.

Имеется баг, который нужно фиксить!
ООП в LUA и профит от него, ООП в LUA и профит от него
 
Цитата
Nikolay написал:
Ну и для примера. У меня в одной из библиотек реализован класс "Ордер". У него есть методы и свойства общие для ордеров.
У него два наследника - "Лимитные ордера", "Стоп ордера". У них уже есть свои, характерные именно для них, методы и свойства.
Это позволяет работать с ордером как с объектом, а не просто как строка в таблице Квика. А методы позволяют реализовать интерфейс к ордеру, в понятных и общих терминах.
Ну да, суть я понял. Скорее для удобства все это дело
ООП в LUA и профит от него, ООП в LUA и профит от него
 
Цитата
новичок написал:
Цитата
Виталий написал:
Если у кого есть еще какие мнения - выслушаю.
тут нет никаких мнений, а либо есть знания, либо их нет - как в Вашем случае.

читайте про АТД и затем про ООП. это фундаментальные вещи.

Цитата
Виталий написал:
Сам я знаком и очень хорошо с традиционным ООП на языках, изначально заточенных под это.... Отсюда  вопрос: есть ли вообще смысл это понять и внедрять  каждом проекте, что это реально дает: экономия памяти, скорость, еще что-то?

видимо пора перейти от поверхностного знакомства к системному изучению ... иначе так и будет - только ошибочное самомнение.
Вы, видимо, один из тех "гуру", которые все знают, но ничего не могут объяснить. А может и не знают даже, но делают вид )) Вопрос был задан конкретно: что дает эмуляция ООП в LUA (это именно эмуляция), причем даже указал конкретно ключевые подвопросы: скорость, память и т.д. Изучать здесь нечего, по крайней мере по ООП в общем. Речь идет конкретно о ЛУА и эмуляции ООП в ЛУА! Форумы придуманы для получения быстрого ответа на вопрос - это комьюнити, где можно получить быстро ответа и сэкономить кучу времени и потратить его на реализацию проекта/задачи, а не зарываться в мануалы, книги и т.д. Если все будут самостоятельно рыться в книгах в поисках ответа - зачем тогда форум и где же вы тогда будете разводить срач?! )))
ООП в LUA и профит от него, ООП в LUA и профит от него
 
По большей части я спрашивал именно касательно луа, а не ООП в целом. Кстати, а откуда Вы взяли эти данные/статистику? Есть какие-то исследования на эту тему? Так-то я никогда не замерял количество кода, единственное замечал, что в некоторых проектах на том же php, сильно проще писать без ООП, если не используешь фреймворки. Код выходит понятнее и реализуется все это куда быстрее. Но спасибо за Ваш ответ, в целом близко к моему мнению. Сам писал без ООП, недавно попался проект на ООП и честно говоря я так и не понял: нафига?!
Если у кого есть еще какие мнения - выслушаю.
ООП в LUA и профит от него, ООП в LUA и профит от него
 
Добрый день. Кто может разъяснить (может даже с обоснованием) зачем ООП в LUA? Т.е. какой от него профит и действительно ли он так нужен? Я видел кучу примеров. Сам я знаком и очень хорошо с традиционным ООП на языках, изначально заточенных под это. Примеры на LUA видел разные и честно скажу не сразу одуплил. Отсюда  вопрос: есть ли вообще смысл это понять и внедрять  каждом проекте, что это реально дает: экономия памяти, скорость, еще что-то?
Тестирование стратегий, Возможность тестирования
 
Добрый день. Подскажите, в каком статусе сейчас заявка на тестирование стратегий, уже приступили? Какие сроки выполнения? Ввиду темы https://forum.quik.ru/messages/forum14/message43085/topic5191/?result=reply#message43085 было бы крайне актуально, т.к. два дня разбирался с простой, как оказалось, ошибкой! Мало того, что код чужой, так в добавок тестить нужно только на живом рынке. Это довольно сложно по ряду обстоятельств: работа днем, риск живыми деньгами, ожидание даже самого минимального сигнала от 15 минут (такая стратегия). Было бы тестирование - стало бы намного веселее! Интересуют сроки, т.к. эта вещь очень нужная и, если вы ее не делаете, тогда мне будет смысл сделать свой вариант, хотя бы на первое время. Хочу понять стоит ли мне тратить на это ресурсы.
Страницы: 1 2 След.
Наверх