Кривые шибки в QLua

Страницы: Пред. 1 2 3 4 5 6 След.
RSS
Кривые шибки в QLua
 
Цитата
Владимир написал:
Vladimir Ivanov, У меня уже много лет нет ни малейших претензий к каналам связи - да, они сильно изменились, но, надеюсь, в лучшую сторону? Связь у меня рвётся не каждый день, используется годами практически ежедневно, и проводить какое-либо её тестирование я не вижу смысла. Очевидно, проблемы в софте. Если "в шифрованном соединении пропадает один - три пакета, то соединение ломается", то софт просто никуда не годится. АДНАЗНАЧНА! Ведь софт тоже, надеюсь, должен меняться в лучшую сторону.

Я не понимаю, какие у Вас претензии к моему стилю - я почти всегда вежлив с собеседниками (что далеко не всегда можно сказать о некоторых из них), и я много лет знаю, что для качественной полемики эффективнее всего работает именно провокативная лексика. По крайней мере, при разговоре со специалистами. За все 30 лет моего пребывания в Инете я никогда не прятался, никогда не имел ника, по которому не было бы очевидно, что я - это я, и не вижу ни единой причины, по которой любые мои посты не должны быть видны участникам форума.

У меня здесь три компа, в один воткнут оптоволоконный кабель, а два других (в том числе тот, который используется для торговли) подключены через WiFi, но на торговом компе, кроме двух Квиков, вообще ничего нет - там просто смешной траффик, а на втором почти всегда идёт какое-то видео из Ютуба. Сейчас все три компа работают, никаких проблем со связью нет, на одном работают два Квика, на втором я пишу это сообщение и слушаю Пионтковского - он тоже подключен через WiFi. Более того, как я сказал ранее, такое поведение НЕ МОЖЕТ быть объяснено некачественной связью, связь разрывает сам сервер, и разрывает её потому, что думает, что происходит вторая попытка авторизации - типа, злоумышленник пытается войти.
Просьба выполнить рекомендации, направленные Вам выше. Вдаваться в полемику не вижу смысла. Объяснять Вам что такое шифрованное соединение и как оно работает, тем более.
После выполнения рекомендаций направьте нам результаты, пожалуйста.
 
Vladimir Ivanov, А зачем, простите, "выполнять рекомендации, направленные мне выше"? Все эти "рекомендации" исходят из единственной гипотезы - наличие проблем со связью, а я ещё в первом своём сообщении показал, что гипотеза эта несостоятельна, что такое поведение НЕ МОЖЕТ быть вызвано никакими подобными проблемами.

А я разве просил Вас "объяснять мне что такое шифрованное соединение и как оно работает"? Я всего лишь сказал, что ЕСЛИ "шифрованное соединение ломается, когда пропадает один - три пакета, ТО такое соединение есть полное дерьмо. Поскольку соединение по защищённому каналу должно бы быть, как минимум, не менее надёжным, чем по незащищённому, иначе кому такое говно вообще нужно? Уж за полвека можно было бы и научиться передаче данных по каналам связи. Тем более, что передача зашифрованных данных НИЧЕМ не отличается от передачи любых других данных. Тем более, в Интернет, который и существует-то именно как сеть передачи данных - какие тут  ПРИНЦИПЕ могут быть "требования Quik к каналу"? Интернету соответствуют, а какому-то несчастному Квику не соответствуют? Тогда это просто фантастическое дерьмо, а не программное обеспечение!

Ха-ха-ха! Ну да, так и есть:
Требования к оборудованию и программному обеспечению
Для работы с системой QUIK необходим компьютер и доступ в интернет. Компьютер должен соответствовать следующим минимальным требованиям:
• компьютер с доступом в интернет;
• оперативная память не менее 2 Гб (рекомендуется 4 Гб);  
• не менее 2 Гб свободного пространства на жестком диске после установки дистрибутива;
• минимальное разрешение экрана – 1024×600 пикселей;
• операционная система Windows (×64) редакций Vista/Server 2008/7/Server 2012/8/10/Server 2016.
Требования к каналу связи
• протокол передачи данных ТСР/IP;
• пропускная способность канала связи не менее 14,4 Кбит/сек;

То есть вся эта лабуда построена ПОВЕРХ ТСР, который, к слову, является НАДЁЖНЫМ протоколом передачи данных, так что вся та лапша, которую Вы мне вчера вешали про "пропадание одного - трёх пакетов", мягко говоря, не соответствует действительности. :wink:  
 
Цитата
Владимир написал:
Vladimir Ivanov, А зачем, простите, "выполнять рекомендации, направленные мне выше"? Все эти "рекомендации" исходят из единственной гипотезы - наличие проблем со связью, а я ещё в первом своём сообщении показал, что гипотеза эта несостоятельна, что такое поведение НЕ МОЖЕТ быть вызвано никакими подобными проблемами.

полное дерьмо. такое говно фантастическое  дерьмо, а не программное обеспечение!
Поскольку Вы игнорируете просьбы о конструктивном диалоге всё больше прибегая к профанации и провокациям, я не смогу оказать Вам помощь.
 
Vladimir Ivanov, А где Вы увидели хоть намёк на конструктив? Я жаловался на диагностику  "вы уже работаете в системе". Режь меня, жги меня - я не понимаю, как это можно пришпилить к проблемам со связью. Эта диагностика В ПРИНЦИПЕ не может быть связана со сбоями связи, так что ТАКАЯ "помощь" мне нафиг не нужна. В любом случае, мне лучше знать, работаю я в системе или нет.
 
Цитата
Владимир написал:
А где Вы увидели хоть намёк на конструктив
О том и речь. От Вас его не поступало. Вам предложили решение проблемы трижды, вместо этого было то, что было выше.

Цитата
Владимир написал:
Я жаловался на диагностику  "вы уже работаете в системе". Режь меня, жги меня - я  не понимаю , как это можно пришпилить к проблемам со связью.
Это действительно заметно. К сожалению, крайне сложно объяснить "сисадмину инет-провайдера", как устроены и работают ЛВС, но для этого есть профильные форумы и множество полезных ресурсов в интернете.
Здесь мы оказываем помощь в решении проблем с ПО Quik.
 
Vladimir Ivanov, То, что мне предложили, НЕ ЕСТЬ решение проблемы. Какова бы ни была связь, пакеты с запросом на аутентификацию ДОШЛИ до сервера, он ОПОЗНАЛ их содержимое, и вместо того, чтобы продолжить работу, с какого-то бодуна решил, что клиент уже работает в системе и РАЗОРВАЛ установленную связь. Даже если при этом НИ ОДНОГО пакета не было потеряно, результат был бы тот же самый. Это устойчиво повторяющееся действие - обычно в течение нескольких минут., после чего до этого придурка всё же доходит, что клиент больше не работает в системе, и он перестаёт рвать связь. Следовательно, предлагаемое мне "решение" не имеет ничего общего с проблемой - это на 146% глюк самого Квика.

А с чего Вы решили, что я хуже Вас знаю как устроены и работают ЛВС? Именно Вы мне тут вчера сказки рассказывали, что надёжность передачи по защищённому каналу позорно низкая, и что пропадание несчастных "одного - трёх пакетов" может привести к разрыву связи. Обалдев от столь потрясающего заявления, я всё-таки полез в Интернет, и первая же попавшая ссылка рассказала мне, что связь в Квике организована ПОВЕРХ протокола ТСР и, следовательно, Ваши слова есть именно сказки, ничего общего не имеющие с действительностью. А про Интернет, в т.ч. про стек протоколов, я когда-то полугодовой курс лекций читал перед сотрудниками разных предприятий, но это было ещё в прошлом тысячелетии, в бытность мою первым сисадмином первого городского провайдера..
 
Цитата
Старатель написал:
Цитата
Старатель написал:
Код
   local  Time  =  tonumber(( os.date (  '%H%M'  )))
 if  Time  >  =   2300   then   
 Ошибка:  
Цитата
attempt to compare number with nil

Думал такие ошибки возникают только в QUIK 9. Но нет, сегодня в QUIK 8.13 случилась аналогичная ошибка.
QUIK clients support , надо что-то делать. Не хочется все места с tonumber параноидально обкладывать проверкой на nil.

К сожалению, по присланным данным нам не удалось установить причину ошибки.
Мы продолжаем изучение вопроса по Вашему обращению. Как только работы будут завершены, мы отправим Вам соответствующее уведомление.
Приносим извинения за причиненные неудобства.
 
Цитата
Даниил Волошин написал:
К сожалению, по присланным данным нам не удалось установить причину ошибки.Мы продолжаем изучение вопроса по Вашему обращению. Как только работы будут завершены, мы отправим Вам соответствующее уведомление.Приносим извинения за причиненные неудобства.
   Разработчики QUIK читали мой комментарий: https://forum.quik.ru/messages/forum10/message64871/topic5823/#message64871 ?   В нем детально описано: функция tonumber для случая многопоточного использования Lua, как это делается в QUIK, реализована некорректно. Что в моем комментарии непонятно разработчикам QUIK?
 
Цитата
Alexey Danin написал:
Цитата
TGB написал:
Если написанное мною в комментарии #177 правильное, то причина понятна и понятно как ее можно исправить.  Пусть разработчик QUIK объяснит, в чем я ошибаюсь.
Спасибо, передали информацию разработчикам.

Как и было сказано ранее моим коллегой, соответствующая информация была передана разработчикам, разбор проблемы продолжается. Как только работы будут завершены, мы отправим Вам соответствующее уведомление.
 
Цитата
Даниил Волошин написал:
разбор проблемы продолжается. Как только работы будут завершены, мы отправим Вам соответствующее уведомление.
  Первый раз я относительно проблемы написал 05.07.2022. До сих пор разработчик не понял мною написанное и стесняется  :smile:  задать вопросы?
 
Добрый день!

Использую типовой скрипт из сети для запуска и проверки работы.
Скрипт запускается(загорается зелёный play), но ничего не происходит, остальные скрипты(в т.ч. с этого форума) ведут себя таким же образом.
Система Windows'11, Quik 9.7.1.10,скрипт лежит и в папке Quik и в других эффект один и тот же. В чём может быть проблема?
Вот полный код скрипта:
Код
IsRun = true;
 
function OnInit()
   -- Здесь будет Ваш код для начальной инициализации
end;
 
function main()
   while IsRun do
 
   -- Здесь будет Ваш код,
   -- который будет выполнятся,
   -- пока скрипт не остановлен
   message("Hello, World!",1);
 
   sleep(1);
   end;
end;
 
function OnStop()
   -- Здесь будет Ваш код,
   -- который нужно выполнить
   -- перед остановкой скрипта
   IsRun = false;
end;
 
Цитата
Алексей написал:
Добрый день!

Использую типовой скрипт из сети для запуска и проверки работы.
Скрипт запускается(загорается зелёный play), но ничего не происходит, остальные скрипты(в т.ч. с этого форума) ведут себя таким же образом.
Система Windows'11, Quik 9.7.1.10,скрипт лежит и в папке Quik и в других эффект один и тот же. В чём может быть проблема?
Вот полный код скрипта:
Код
  IsRun  =   true ;
 
 function   OnInit ()
    -- Здесь будет Ваш код для начальной инициализации 
 end ;
 
 function   main ()
    while  IsRun  do 
 
    -- Здесь будет Ваш код, 
    -- который будет выполнятся, 
    -- пока скрипт не остановлен 
    message ( "Hello, World!" , 1 );
 
    sleep ( 1 );
    end ;
 end ;
 
 function   OnStop ()
    -- Здесь будет Ваш код, 
    -- который нужно выполнить 
    -- перед остановкой скрипта 
   IsRun  =   false ;
 end ;
  
Попробуйте создать в папке Quik папку LuaIndicators и положить туда скрипт.
 
Цитата
Алексей написал:
В чём может быть проблема?
Скрипт рабочий, выводит "Hello, World" в окно сообщений.
Тут не работать нечему

У вас окно сообщений то хоть на панели имеется?
 
Цитата
Роман написал:
Попробуйте создать в папке Quik папку LuaIndicators и положить туда скрипт.
Не надо ерунды советовать, этот скрипт не индикатор
 
Цитата
Роман написал:
IsRun = true;

function OnInit()
  -- Здесь будет Ваш код для начальной инициализации
end;

function main()
  while IsRun do

  -- Здесь будет Ваш код,
  -- который будет выполнятся,
  -- пока скрипт не остановлен
  message("Hello, World!",1);

  sleep(1);
  end;
end;

function OnStop()
  -- Здесь будет Ваш код,
  -- который нужно выполнить
  -- перед остановкой скрипта
  IsRun = false;
end;
Попробуйте увеличить  sleep(1000);  
 
Цитата
BlaZed написал:
Цитата
Алексей написал:
В чём может быть проблема?
Скрипт рабочий, выводит "Hello, World" в окно сообщений.
Тут не работать нечему

У вас окно сообщений то хоть на панели имеется?
Спасибо, было в этом дело! Предполагал, что сообщение в виде всплывающего окна.
 
Уф, после долгого отдыха доделал таки тест кейс, который доказывает что действительно в Quik есть мьютекс на lua_lock/lua_unlock.
Моя ошибка в прошлый раз было предположение что sleep в Quik Lua - это функция на lua. Вот и нет, это cfunction.
Поэтому вызов её с любым большим значением из нескольких потоков к блокировке не приводит.
Если я поменял тест: сделал два потока в C++, которые обращались в CustomSleep на Quik Lua, одновременно. А в CustomSleep я просто сделал очень большой цикл.
В итоге поток Б ждал возврата потока А из lua CustomSleep. Блокировка налицо, хотя в моем C и моем Lua её нет.

Итак схема работы как я её сейчас вижу, ещё раз:
Quik Lua обычный работает в однопоточном режиме (+ колбэки), под единой блокировкой.
При обращении из lua в C функцию (любая ваша собственная библиотека dll), блокировка снимается, при возвращении оттуда - снова возвращается блокировка.
Если же из C функции идет вызов другой функции по pcall например, то при обращении в Lua блокировка тоже навешивается, а при возврате - снимается.
всё просходит попарно.
Так же блокировки вешаются при обращении к любым функциям которые меняют стек, типа lua_pop. Но не к tonumber (о чем тут начался пост), потому что он стек не меняет.

Почему это было важно мне? Хотел понимать, где могут блокироваться потоки из C, которые конкуретно, но под моей собственной критической секцией обращаются в Lua.
Возможно, в моем случае эта самая дополнительная критическая секция не очень-то и нужна, или надо очень аккуратно выстраивать работу, чтобы не пересекать блокировки в Quik Lua и мои собственные.
 
! Для поддержки QUIK:
1. Вы зря игнорируете замечания пользователей. Конструктивные замечания пользователей и их учет разработчиком QUIK облегчат вам работу (но грозит последующими уволь-нениями  :smile: ).
2. В QLua можно, условно, выделить два уровня:
1) системный (обеспечивающий исполнение скриптов пользователей);
2) прикладной (обеспечивающий команды управления QUIK, например, работу с табли-цами QUIK – и это, точно, не таблицы Lua  :smile: ).
   В данном комментарии я не буду обсуждать прикладной уровень. Там, до сих пор, много ошибок  и это демонстрируют многие комментарии данного форума.
   На системном уровне, так как я это вижу (ошибок может быть, наверное, и больше),  в текущий момент, на 25.01.23, в QLua есть следующие ошибки:
 1) Ошибка в стандартной функции tosting, в режиме  использования Lua в нескольких потоках (как это делается сейчас в QLua), обнаруженная Старателем;
 2) Системная ошибка взаимоблокировки (выполнением «чистого кода Lua») потока main и основ-ного потока QUIK, реализующего колбеки (об этом я в этом форуме много писал).  В конце, концов я снял свое предложение по устранению данной ошибки, с пониманием того, что в QLua версии >= 5.4 для разработчика QLua, это неразрешимая задача  :smile: .
 3) Существующая ошибка в QLua версиии 5.3, которую разработчик не собирается устранять, неофициально отказываясь от ее поддержки (заявляя это, втихомолку  :smile: , в данном форуме), Причем, что характерно, бесперспективно  :smile: , мною предложен конкретный простой тест для анализа этой ошибки.
 
Цитата
Павел Bosco написал:
Уф, после долгого отдыха доделал таки тест кейс, который доказывает что действительно в Quik есть мьютекс на lua_lock/lua_unlock.
Моя ошибка в  прошлый раз  было предположение что sleep в Quik Lua - это функция на lua. Вот и нет, это cfunction.
Поэтому вызов её с любым большим значением из нескольких потоков к блокировке не приводит.
Если я поменял тест: сделал два потока в C++, которые обращались в CustomSleep на Quik Lua, одновременно. А в CustomSleep я просто сделал очень большой цикл.
В итоге поток Б ждал возврата потока А из lua CustomSleep. Блокировка налицо, хотя в моем C и моем Lua её нет.

Итак схема работы как я её сейчас вижу, ещё раз:
Quik Lua обычный работает в однопоточном режиме (+ колбэки), под единой блокировкой.
При обращении из lua в C функцию (любая ваша собственная библиотека dll), блокировка снимается, при возвращении оттуда - снова возвращается блокировка.
Если же из C функции идет вызов другой функции по pcall например, то при обращении в Lua блокировка тоже навешивается, а при возврате - снимается.
всё просходит попарно.
Так же блокировки вешаются при обращении к любым функциям которые меняют стек, типа lua_pop. Но не к tonumber (о чем тут начался пост), потому что он стек не меняет.

Почему это было важно мне? Хотел понимать, где могут блокироваться потоки из C, которые конкуретно, но под моей собственной критической секцией обращаются в Lua.
Возможно, в моем случае эта самая дополнительная критическая секция не очень-то и нужна, или надо очень аккуратно выстраивать работу, чтобы не пересекать блокировки в Quik Lua и мои собственные.
На форуме я выкладывал результаты теста исполнения обращения к общему глобальному стеку и там все предельно ясно.
------------------------
По моим тестам ситуация следующая.
-------------------------
Функция main запускается в отдельном потоке, но имеет общий глобальный стек с основным потоком, в котором запускаются колбеки.
Поэтому, если Вы обращаетесь к глобальным переменным , то обращение к этим переменным реализуется через критические секции
и следовательно майн и основной поток будут ждать друг друга т е буде блокировка.
--------------------
Локальные стеки у луа машин майн и основного потока разные и следовательно синхронизация потоков при обращении к ним не требуется и нет блокировки.
==================

Кроме того, уже писал на форуме, что тестил работу пула потоков.
------------------
Тест состоял в следующем.
Новый поток активировался для нового колбека
или для колбека активировался новый поток,
если предыдущий вызов колбека еще не был полностью обработан потоком.
---------------
В тесте при совершении сделки по инструменту выставлялась заявка и после ее регистрации она снималась.
-----------------
В итоге тест работал 4 часа по 200 инструментам выставил и снял более 200 тысяч заявок.
в процессе выполнения активировалось максимум 12 потоков (1 раз) , наиболее часто активировалось 5 потоков.
=================
И все работало без проблем и ошибок.
===============
 
 
Цитата
nikolz написал:
Локальные стеки у луа машин майн и основного потока разные и следовательно синхронизация потоков при обращении к ним не требуется и нет блокировки.
 Это было бы верно, если бы в Qlua не было общего ресурса потоков:  сборки мусора (GC).  При своем запуске, GC "ползает" по всем стекам и не является потокобезопасным. Поэтому для всех потоков QLua все фрагменты скрипта, за исключением, вызываемых С- функций, являются разделяемым ресурсом (потоки синхронизируются).  Нет синхронизации потоков только при выполнении C-функций, вызванных в скрипте.
 
TGB, добрый день.

Приведите, пожалуйста, ссылки на упоминаемые Вами обращения, проверим информацию.
 
Цитата
Anton Belonogov написал:
Приведите, пожалуйста, ссылки на упоминаемые Вами обращения, проверим информацию.
  Здравствуйте.
Цитата
TGB написал:
1) Ошибка в стандартной функции tosting, в режиме  использования Lua в нескольких потоках (как это делается сейчас в QLua), обнаруженная Старателем;
 Ссылка на мой повтор: : https://forum.quik.ru/messages/forum10/message64871/topic5823/#message64871

Цитата
TGB написал:
2) Системная ошибка взаимоблокировки (выполнением «чистого кода Lua») потока main и основного потока QUIK,
Ссылка на мое первоначальное предложение: https://forum.quik.ru/messages/forum10/message54998/topic5119/#message54998

Цитата
TGB написал:
3) Существующая ошибка в QLua версиии 5.3, которую разработчик не собирается устранять, неофициально отказываясь от ее поддержки (заявляя это, втихомолку   , в данном форуме), Причем, что характерно, бесперспективно   , мною предложен конкретный простой тест для анализа этой ошибки.
Ссылка на мой повтор: https://forum.quik.ru/messages/forum10/message58500/topic5823/#message58500
Ответ поддержки: https://forum.quik.ru/messages/forum10/message59594/topic5823/#message59594
 
Цитата
TGB написал:
Цитата
nikolz написал:
Локальные стеки у луа машин майн и основного потока разные и следовательно синхронизация потоков при обращении к ним не требуется и нет блокировки.
  Это было бы верно, если бы в Qlua не было общего ресурса потоков:  сборки мусора (GC).  При своем запуске, GC "ползает" по всем стекам и не является потокобезопасным. Поэтому для всех потоков QLua все фрагменты скрипта, за исключением, вызываемых С- функций, являются разделяемым ресурсом (потоки синхронизируются).  Нет синхронизации потоков только при выполнении C-функций, вызванных в скрипте.
Вы почему-то опускаете тот момент, что синхронизация нужна лишь при изменении потоками общих данных . т е если данные лишь читаются, то синхронизация обращения к ним потков не требуется.
Во всех приведенных Вами обсуждаемых фрагментах, Вы этот факт не учитываете.  
 
Цитата
nikolz написал:
Вы почему-то опускаете тот момент, что синхронизация нужна лишь при изменении потоками общих данных . т е если данные лишь читаются, то синхронизация обращения к ним потков не требуется.

Цитата
nikolz написал:
При своем запуске, GC "ползает" по всем стекам
и при этом изменяет их данные.
  Возможно  :smile: , вам известно, что сборка мусора это нетривиальная задача даже при реализации ее в однопоточном варианте. Например, в C# для программы допускается работа в нескольких потоках, но Microsoft, с ее немалыми ресурсами, не смогла реализовать потокобезопасный сборщик мусора и при его работе "замораживает" выполнение потоков.
 То что делается в QLua, я описал в своем комментарии.
 
В цитате "nikolz написал:
При своем запуске, GC "ползает" по всем стекам":  вместо nikolz читать TGB.
 
TGB, благодарим за информацию.

По обращению 1 мы производим анализ проблемы, к сожалению, он еще не завершен. Как только результат будет получен, мы поделимся с Вами информацией.
По обращениям 2, 3 отвечали Вам ранее, что доработки в Lua 5.3 не будут выполняться, рекомендуем использовать Lua 5.4.
 
Цитата
Anton Belonogov написал:
По обращению 1 мы производим анализ проблемы, к сожалению, он еще не завершен. Как только результат будет получен, мы поделимся с Вами информацией.
   Если есть конкретные вопросы по моему тексту, то я попытаюсь ответить.
 
Цитата
Anton Belonogov написал:
По обращениям 2, 3 отвечали Вам ранее, что доработки в Lua 5.3 не будут выполняться, рекомендуем использовать Lua 5.4.
   Проблема 2 относится и к QLua 5.4, но в QLua 5.4 я не вижу ее простого решения и, как я написал, это свое предложение снимаю.
 
Цитата
Anton Belonogov написал:
По обращению 1 мы производим анализ проблемы, к сожалению, он еще не завершен.
  Описав в своем комментарии, в чем, по моему мнению, заключается ошибка использования существующей функции tostring в QLua, я не привел решения по ее ее устранения.
   Приведу в данном комментарии один из вариантов решения:
     1)  В начале функции tostring  вставить lua_lock(L);
     2)  В конце всех завершений функции вставить  lua_unlock(L).
 
Цитата
TGB написал:
Цитата
Anton Belonogov написал:
По обращению 1 мы производим анализ проблемы, к сожалению, он еще не завершен.
   Описав в своем комментарии, в чем, по моему мнению, заключается ошибка использования существующей функции tostring в QLua, я не привел решения по ее ее устранения.
   Приведу в данном комментарии один из вариантов решения:
     1)  В начале функции tostring  вставить lua_lock(L);
     2)  В конце всех завершений функции вставить  lua_unlock(L).
так вроде все есть
смотрим sorce 5.3:

LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) {
 StkId o = index2addr(L, idx);
 if (!ttisstring(o)) {
   if (!cvt2str(o)) {  /* not convertible? */
     if (len != NULL) *len = 0;
     return NULL;
   }
   lua_lock(L); /* 'luaO_tostring' may create a new string */
   luaO_tostring(L, o);
   luaC_checkGC(L);
   o = index2addr(L, idx);  /* previous call may reallocate the stack */
   lua_unlock(L);
 }
 if (len != NULL)
   *len = vslen(o);
 return svalue(o);
}
-------------------
что не так?
 
Цитата
nikolz написал:
LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len)
..........
что не так?
Это не стандартная функция tostring, которая используется внутри Lua, а функция из C-API (файл lapi.c), которая используется программами пользователя, написанными на C++ при  взаимодействии с Lua.  
Стандартная tostring описана в файле lbaselib.c (lua 5.4).
Вот список стандартных базовых функций:
Код
static const luaL_Reg base_funcs[] = {
  {"assert", luaB_assert},
  {"collectgarbage", luaB_collectgarbage},
  {"dofile", luaB_dofile},
  {"error", luaB_error},
  {"getmetatable", luaB_getmetatable},
  {"ipairs", luaB_ipairs},
  {"loadfile", luaB_loadfile},
  {"load", luaB_load},
  {"next", luaB_next},
  {"pairs", luaB_pairs},
  {"pcall", luaB_pcall},
  {"print", luaB_print},
  {"warn", luaB_warn},
  {"rawequal", luaB_rawequal},
  {"rawlen", luaB_rawlen},
  {"rawget", luaB_rawget},
  {"rawset", luaB_rawset},
  {"select", luaB_select},
  {"setmetatable", luaB_setmetatable},
  {"tonumber", luaB_tonumber},
  {"tostring", luaB_tostring},
  {"type", luaB_type},
  {"xpcall", luaB_xpcall},
  /* placeholders */
  {LUA_GNAME, NULL},
  {"_VERSION", NULL},
  {NULL, NULL}
};


А вот код функции luaB_tostring, который реализует "tostring" и в которой вызывается luaL_tolstring(L, 1, NULL):
Код
static int luaB_tostring (lua_State *L) {
  luaL_checkany(L, 1);
  luaL_tolstring(L, 1, NULL);
  return 1;
}
//  -------  Вызывается в luaB_tostring (lua_State *L)  --
LUALIB_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len) {
  idx = lua_absindex(L,idx);
  if (luaL_callmeta(L, idx, "__tostring")) {  /* metafield? */
    if (!lua_isstring(L, -1))
      luaL_error(L, "'__tostring' must return a string");
  }
  else {
    switch (lua_type(L, idx)) {
      case LUA_TNUMBER: {
        if (lua_isinteger(L, idx))
          lua_pushfstring(L, "%I", (LUAI_UACINT)lua_tointeger(L, idx));
        else
          lua_pushfstring(L, "%f", (LUAI_UACNUMBER)lua_tonumber(L, idx));
        break;
      }
      case LUA_TSTRING:
        lua_pushvalue(L, idx);
        break;
      case LUA_TBOOLEAN:
        lua_pushstring(L, (lua_toboolean(L, idx) ? "true" : "false"));
        break;
      case LUA_TNIL:
        lua_pushliteral(L, "nil");
        break;
      default: {
        int tt = luaL_getmetafield(L, idx, "__name");  /* try name */
        const char *kind = (tt == LUA_TSTRING) ? lua_tostring(L, -1) :
                                                 luaL_typename(L, idx);
        lua_pushfstring(L, "%s: %p", kind, lua_topointer(L, idx));
        if (tt != LUA_TNIL)
          lua_remove(L, -2);  /* remove '__name' */
        break;
      }
    }
  }
  return lua_tolstring(L, -1, len);
}

  Ну и так далее.
-------
 Когда вы пишите, например, в скрипте   tolstring (5), то используется   luaB_tostring. Эта же функция используется неявно Lua для преобразования числа 1 в строку, если вы написали: "текст " ..  1 .
 
Цитата
TGB написал:
tolstring
В скрипте нельзя вызвать эту функцию, там мы пишем tostring, а не tolstring
Цитата
TGB написал:
lbaselib.c
в таком случае, смотрим приведенную Вами функцию.
В ней выполняются различные преобразования в зависимости от типа исходного значения.
Но во всех случаях сначала преобразуемые данные извлекаются  с помощью функции
  lua_pushfstring
смотрим эту функцию:
LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) {  const char *ret;
 va_list argp;
 lua_lock(L);
 va_start(argp, fmt);
 ret = luaO_pushvfstring(L, fmt, argp);
 va_end(argp);
 luaC_checkGC(L);
 lua_unlock(L);
 return ret;
}
----------------
Ой, что не так?
 
Цитата
nikolz написал:
Ой, что не так?
Вы что, только писать умеете?
Читайте ранее написанное мною: https://forum.quik.ru/messages/forum10/message64871/topic5823/#message64871
Вообще, вы мне надоели со своими неуклюжими попытками "уесть" меня. Что вы вы все время "надуваете" свои щеки? Ведь можете лопнуть.
 
Цитата
Anton Belonogov написал:
По обращению 1 мы производим анализ проблемы, к сожалению, он еще не завершен.
   
Цитата
TGB написал:
1) Ошибка в стандартной функции tosting, в режиме  использования Lua в нескольких потоках (как это делается сейчас в QLua), обнаруженная Старателем;
  Выше вместо tosting должно быть tonumber. Это моя ошибка.  По ссылке https://forum.quik.ru/messages/forum10/message64871/topic5823/#message64871 идет речь о tonumber.
 
Цитата
nikolz написал:
Ой, что не так?
  Не ту функцию с вами обсуждаем (смотрите мой предыдущий комментарий):smile: . Напрасно я вам мозги "пудрил". Но вы меня не читаете. Давно бы меня разоблачили.
 
Ну давайте посмотрим tonumber
{"tonumber", luaB_tonumber},
---------------------------------------
static int luaB_tonumber (lua_State *L) {
if (lua_isnoneornil(L, 2)) { /* standard conversion? */
luaL_checkany(L, 1);
if (lua_type(L, 1) == LUA_TNUMBER) { /* already a number? */
lua_settop(L, 1); /* yes; return it */
return 1;
}
в этой части  ничего не преобразуется так как это и есть число
===================================-
else {
size_t l;
const char *s = lua_tolstring(L, 1, &l);
if (s != NULL && lua_stringtonumber(L, s) == l + 1)
return 1; /* successful conversion to number */
/* else not a number */
}
}
в этой части преобразуется строка в число и используется функция lua_tolstring  ранее уже показывал, повторю:

LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) {  StkId o = index2addr(L, idx);
 if (!ttisstring(o)) {
   if (!cvt2str(o)) {  /* not convertible? */
     if (len != NULL) *len = 0;
     return NULL;
   }
   lua_lock(L);  /* 'luaO_tostring' may create a new string */
   luaO_tostring(L, o);
   luaC_checkGC(L);
   o = index2addr(L, idx);  /* previous call may reallocate the stack */
   lua_unlock(L);
 }
 if (len != NULL)
   *len = vslen(o);
 return svalue(o);
}
=================================
else {
size_t l;
const char *s;
lua_Integer n = 0; /* to avoid warnings */
lua_Integer base = luaL_checkinteger(L, 2);
luaL_checktype(L, 1, LUA_TSTRING); /* no numbers as strings */
s = lua_tolstring(L, 1, &l);
luaL_argcheck(L, 2 <= base && base <= 36, 2, "base out of range");
if (b_str2int(s, (int)base, &n) == s + l) {
lua_pushinteger(L, n);
return 1;
} /* else not a number */
} /* else not a number */
lua_pushnil(L); /* not a number */
return 1;
}
в этой части выясняется что строка не является числом при этом для строки тоже используется lua_tolstring  ранее уже показывал
-------------------------------------
if (lua_isnoneornil(L, 2)) { /* standard conversion? */
luaL_checkany(L, 1);
if (lua_type(L, 1) == LUA_TNUMBER) { /* already a number? */
lua_settop(L, 1); /* yes; return it */
return 1;
}
------------------------------
Резюме, в преобразовании tonumber  блокировка делается при получении копии строки.
Все правильно?  Проблемы нет?
 
Цитата
nikolz написал:
else {size_t l;
 const char *s =  lua_tolstring (L, 1, &l);
 if (s != NULL &&  lua_stringtonumber (L, s) == l + 1)return 1; /* successful conversion to number *//* else not a number */
  }
}
в этой части преобразуется строка в число и используется функция  lua_tolstring   ранее уже показывал, повторю:
 А функция lua_stringtonumber  для вас, конечно, не существует. Вы думаете, что она никогда не вызывается?  Даже если надо преобразовать число, представленное в виде строки?
 Вы все-таки читайте то, что я пишу. Я же дал вам ссылку на свой разбор ситуации. И эта ссылка многократно повторялась ранее.
 Но для вас повторю написанное мной ранее (цитирую себя):
----
  При просмотре исходника функции tonumber (с учетом вызываемых в ней функций), я обнаружил, что в этой функции есть как минимум один фрагмент с использованием операций в L без синхронизирующих скобок (мои комментарии помечены в исходнике символами #####).
!!!   lua_stringtonumber вызывается в tonumber:
LUA_API size_t lua_stringtonumber (lua_State *L, const char *s) {
size_t sz = luaO_str2num(s, s2v(L->top));   //  ##### ? используется L без синхронизирующих скобок
if (sz != 0)
  api_incr_top(L);                                      //  ##### ? используется L без синхронизирующих скобок
return sz;
}
   Возможно, что-то я упустил, но пусть это проверит разработчик QUIK.
----
В конструкциях luaO_str2num и api_incr_top в качестве параметров используется L.
Найдите в этих конструкциях синхронизирующие скобки lua_unlock(L); lua_lock(L) и тогда мы продолжим общение.
 
Цитата
TGB написал:
const char *s =  lua_tolstring (L, 1, &l);  if (s != NULL &&  lua_stringtonumber (L, s) == l + 1)return 1; /* successful conversion to number *//* else not a number */
Разработчики КВИКА  к разработке VMLua  имеют ровно такое же отношение как мы с вами - т е НИКАКОГО.
------------------------------
поясните, зачем окружать указатель на стек, если он никогда не изменяется потоками
В скриптах QUIK, указатель на глобальный стек у основного потока и потока main  один и тот же,
а локальные стеки у каждого потока свой и их вообще нет смысла синхронизировать.
----------------------------
Синхронизировать надо не код программы, а обращение к одним и тем же областям данных.
===============
В данном случае - это область данных в глобальном стеке.
Но ее как раз и синхронизировали разработчики КВИК в функциях библиотеки QLUA
и сделали 3 функции потокобезопасные для обращения к таблицам.
Все что они сделали работает.
-----------------------
Все сверх этого пишите сами , если это надо Вам.
Вы хотите чтобы они занялись разработкой VMLua?
В чем проблема?
 
Цитата
nikolz написал:
Разработчики КВИКА  к разработке VMLua  имеют ровно такое же отношение как мы с вами - т е НИКАКОГО.
  Я нигде не писал, что разработчики КВИКА разрабатывали VMLua. Но за все ошибки, которые возникают в КВИКе, независимо от того, что разработчик использовал при его создании, отвечают он.
   Вы какой-то сильно непонятливый. Но попробую объяснить вам это на простом примере. Возможно, вы ездите на своей машине. В ней наверняка используется электроника, которую производитель закупал на стороне. Например, эта электроника сломалась. Вы что, побежите со своими претензиями к производителю электроники?
 
Цитата
TGB написал:
Цитата
nikolz написал:
Разработчики КВИКА  к разработке VMLua  имеют ровно такое же отношение как мы с вами - т е НИКАКОГО.
   Я нигде не писал, что разработчики КВИКА разрабатывали VMLua. Но за все ошибки, которые возникают в КВИКе, независимо от того, что разработчик использовал при его создании, отвечают он.
   Вы какой-то сильно непонятливый. Но попробую объяснить вам это на простом примере. Возможно, вы ездите на своей машине. В ней наверняка используется электроника, которую производитель закупал на стороне. Например, эта электроника сломалась. Вы что, побежите со своими претензиями к производителю электроники?
Вы ломитесь в открытые ворота.
-------------------------------
То, что VMLua потоко не безопасная известно с момента ее создания.
-----------------------------
Это не ошибка, а ограничения реализации VMLua, которую изначально создавали для измерительных мобильных устройств .
------------------------------
Для реализации многопоточности в каждой ОС есть свои механизмы.  
----------------------------------
На основе этих механизмов разработчики и реализуют синхронизацию своих приложений.  
-----------------------
В QLUA есть синхронизация в функциях.
-------------------------
Вы пишите cвой скрипт - это Ваше приложение.  Вы его разработчик
Вот и решайте свои проблемы сами, а не перекладывайте их на других.
----------------------------
Я не использую sleep и синхронизирую все потоки Их у меня до 100 штук создается в тестах. Делаю Специально тесты, где потоки долго заняты до 10 секунд на каждой сделке.
В итоге если в одном потоке то сделки последовательно будут обрабатываться через 10 секунд. У меня потоки запускаются через 5-15 мс от прихода сделки.
--------------------------
Судя по Вашим постам Вы не умеете использовать механизмы синхронизации потоков.  
------------------------------------------
Покажите пример как tonumber Вам создает проблему в скрипте или дайте ссылку на такой пример, если Вы его выкладывали с результатами.
Отвечу Вам конкретно, как решить Вашу проблему.
 
Цитата
nikolz написал:
дайте ссылку на такой пример
 nikolz  писатель, а не читатель :smile: ? Вы не умеете читать?
Мною же было написано, что обсуждаемую ошибку QLua обнаружил пользователь Старатель. Читайте: https://forum.quik.ru/messages/forum10/message57110/topic5823/#message57110

Цитата
nikolz написал:
Отвечу Вам конкретно, как решить Вашу проблему.
     Хотя у меня нет проблем, но интересно, какие проблемы вы можете решать, если даже читать не умеет?
 
Пропустил тяжкое обвинение  :smile:  (дополнительное подтверждение написанного ранее о вас):
Цитата
nikolz написал:
Судя по Вашим постам Вы не умеете использовать механизмы синхронизации потоков.  
 Если бы вы умели читать мои комментарии и при этом еще что-то соображать (а это, к сожалению, точно не лечится  :smile:  ), то вы могли бы, наверное, понять, что это ваше очередное заблуждение.
------------
 Кстати (о заблуждениях):
Цитата
nikolz написал:
Локальные стеки у луа машин майн и основного потока разные и следовательно синхронизация потоков при обращении к ним не требуется и нет блокировки.
 Вы что, до сих пор не сообразили, что когда мы с вами «муторно» обсуждали коды на C++, то lua_lock(L)  и   lua_unlock(L)  это те самые блокировки, которые, по вашему мнению, отсутствуют.
------------------------------
 Если же вам захочется продолжение нашего «банкета»  :smile: , то оно будет.
 
nikolz
  Ожидаемо, что вам не захотелось продолжения нашего «банкета», но чтобы у вас, и мысли продолжения его не возникли далее (вы мне надоели), то я сам его и завершу.
  Мне, совершенно, не интересно с вами общаться. Что-то вам объяснить, это неразрешимая задача (на уровне, попытки объяснения обезьяне тензорного исчисления).  Но, я в мягкой форме и неоднократно  пытался вам объяснить, предельно простую мысль, что вам не надо много писать на форуме, пока вы не сможете читать  :smile: .  А если это и произойдет (вы сможете читать) то, похоже, очень не скоро  :smile: .
  Вам вредно изображать из себя «гуру программирования». Вам это не идет. Вы что, не понимаете, что вы смешны со своими сотнями потоками?  Вы несчастный человек. Вам не надо заниматься сложными вещами. Вам, наверное, надо как то осознать ваше реальное место в этой жизни. Вы не торгуете на  фондовом рынке,  хоть и заявляете о каких то «бешенных» процентах. У вас нет приличной работы. Ну кто, в здравом уме, примет вас на приличную работу? Вы безработный или полубезработный и работаете на данном форуме «прокладкой» между комментариями пользователей.
 
Цитата
TGB написал:
nikolz
  Ожидаемо, что вам не захотелось продолжения нашего «банкета», но чтобы у вас, и мысли продолжения его не возникли далее (вы мне надоели), то я сам его и завершу.
  Мне, совершенно, не интересно с вами общаться. Что-то вам объяснить, это неразрешимая задача (на уровне, попытки объяснения обезьяне тензорного исчисления).  Но, я в мягкой форме и неоднократно  пытался вам объяснить, предельно простую мысль, что вам не надо много писать на форуме, пока вы не сможете читать  :: .  А если это и произойдет (вы сможете читать) то, похоже, очень не скоро  :: .
  Вам вредно изображать из себя «гуру программирования». Вам это не идет. Вы что, не понимаете, что вы смешны со своими сотнями потоками?  Вы несчастный человек. Вам не надо заниматься сложными вещами. Вам, наверное, надо как то осознать ваше реальное место в этой жизни. Вы не торгуете на  фондовом рынке,  хоть и заявляете о каких то «бешенных» процентах. У вас нет приличной работы. Ну кто, в здравом уме, примет вас на приличную работу? Вы безработный или полубезработный и работаете на данном форуме «прокладкой» между комментариями пользователей.
Ну и нахрена Вы словесным поносом растеклись по интернету?
--------------------------------
Форум не церковь, а я вам не поп, чтобы слушать Вашу исповедь.  
 
Цитата
nikolz написал:
Форум не церковь, а я вам не поп, чтобы слушать Вашу исповедь.
  Короткий ответ с элементами юмора радует. Это путь к исправлению. Но вы опять что-то перепутали, скорее я выступил в роли попа со своими наставлениями :smile: .
 
Цитата
nikolz написал:
В итоге тест работал 4 часа
4 часа - это не срок. У меня скрипты годами (!) работают, но иногда вылазят ошибки, описанные в данном треде. Многие ошибки даже за неделю непрерывных нагрузочных тестов нереально воспроизвести.
Надо делать так, как надо. А как не надо - делать не надо.
 
Это строка приводит к падению терминала (10.1.2.2):
Код
local sec_list = getClassSecurities('TQOD|TQOB|TQTD|TQTF|EQEO|EQOB|EQDB|SPBBND|SPBXM|QJSIM|TQBR|FQBR|SPBFUT|CETS')

Да, есть ошибка в передаваемом параметре, но, кажется, это не должно приводить к падению. Есть ощущение, что просто нет unit тестов методов qlua...
 
Цитата
Nikolay написал:
Это строка приводит к падению терминала (10.1.2.2):
Код
   local  sec_list  =   getClassSecurities ( 'TQOD|TQOB|TQTD|TQTF|EQEO|EQOB|EQDB|SPBBND|SPBXM|QJSIM|TQBR|FQBR|SPBFUT|CETS' )  

Да, есть ошибка в передаваемом параметре, но, кажется, это не должно приводить к падению. Есть ощущение, что просто нет unit тестов методов qlua...
А не чо, что вместо  разделителя ","  Вы используете  "|" ?
и в конце нет ","
 
Цитата
nikolz написал:
getClassSecurities
То что список некорректный в сообщении указано. А то что входящий параметр в функции getClassSecurities не проверяется тоже очевидно из-за молчаливого падения терминала. Собственно сообщение о падении терминала, а не о работе самой функции. Хотелось бы видеть в методах qlua возвращаемое значение. А если что-то не так, то nil, например, и вторым параметром уже описание - "сам дурак, что на вход передаешь". Сейчас же, случайно переедал не то и привет... И приходится каждый метод qlua оборачивать в свой assert.
 
Цитата
Старатель написал:
Цитата
nikolz написал:
В итоге тест работал 4 часа
4 часа - это не срок. У меня скрипты годами (!) работают, но иногда вылазят ошибки, описанные в данном треде. Многие ошибки даже за неделю непрерывных нагрузочных тестов нереально воспроизвести.
если не учитывать, что за 4 часа колбеки вызывались 4 миллиона раз и было выставлено и снято 500 тысяч заявок.
 
Страницы: Пред. 1 2 3 4 5 6 След.
Читают тему
Наверх