Вячеслав, у вас есть пруф подтверждающий то, что вы сейчас написали, или это ваши фантазии? Как-то всё очень сомнительно выглядит, особенно вот это
Цитата
Вячеслав написал: и в этот момент начнёт выполняться основной поток Quik, который захочет вызвать наш callback, то основной поток Quik будет ждать на lua_lock операции
С обновлением QUIK с сервера РАЗРАБОТЧИКА тоже нет совершенно никаких проблем. А в остальном - не понятно, зачем вы платите деньги такому брокеру, которому на вас откровенно плевать и который не слушает ваше мнение??
Вячеслав написал: Предполагаю, что QLua использует отладочные функции debug.sethook для перехвата управления и переключения Lua VM c потока main на поток callback'ов.
В QLua используются реальные разные потоки операционной системы Windows. Потоки переключает Windows, где реализована вытесняющая мультизадачность. Бесконечные циклы не мешают Windows переключать процессор между исполнением кода разных потоков, никакая Lua VM тут ни при чем. Что вы еще пытаетесь найти в Lua VM?
И да, код в смысле Lua-программы прерывается в реализованном случае вовсе не обязательно "между операторами Lua". Прерваться код может и "посередине выполнения одного из операторов".
sandyman написал: Ау, техподдержка? Может что-то стоит предпринять в отношении такой безалаберности брокеров?
Вы платите деньги брокеру, но требуете, чтобы другие оказывали на него давление. Стандартная позиция терпил в нашем государстве. "Царь-батюшка, убери *** в нашем подъезде, без тебя никак".
А что такое "упрощение"? ну вот конкретно можете нарисовать? Если сделать конфигурацию квика только с нужными вам графиками/таблицами - это упрощение? или что-то всё равно будет мешать? тогда что именно будет мешать в таком случае?
нене, я не предлагаю задумчивое лицо. Это анриал в обсуждаемой ценовой категории. Я про то, что это минимум цен, от которого можно как-то отталкиваться, выходя с предложением к брокеру.
пока, наверное, единственный вариант - как-то сигнализировать из самого скрипта "я запустился". Вариантов можно придумать разных (создать файл с датой/временем запуска, например, сразу при старте скрипта).
Вообще, на мой взгляд, идея хорошая как пожелание: сделать явную индикацию, что при старте QUIK не запустился какой-то скрипт, который должен был запуститься автоматически при старте.
Сергей Чугунов написал: терзают другие "смутные сомнения"...
Да нет никаких "смутных сомнений", ёлы-палы. Ретейловый брокер - это всегда компромисс между стоимостью и качеством. Стоимостью, заметьте, для клиентов, т.е. из вашего кармана. Хотите иметь невообразимые времена задержки - поступайте как делают взрослые парни: скидываетесь брокеру на отдельный для вас сервер, подключаетесь к этому серверу - и радуетесь! А что, скинуться на 10 человек/подключений - глядишь, и радость к нам придёт.
briliantoff написал: А почему-бы в файле настроек не сохранять все настройки QUIKа? Я например использую звуки, уровни, цвета да и других всяких куча, но при переустановке винды или переходе на другой комп все приходится настраивать заново.
Не очень понятно о чем это. Если вы просто скопируете всё папку с QUIK - то все ваши настройки полностью сохранятся. Не понятно как вы так переходите на другой комп, что ничего не сохраняется и приходится перенастраивать заново?
Вы подключены к серверу? по другим типам инструментов удаётся выставить заявки? Если да - то брокер не предоставил вам торговых операций по опционам, вопросы брокеру.
Вячеслав написал: QLua использует 1 мьютекс для разделения выполнения функции main и callback'ов или 2?
Вы задаёте просто удивительные вопросы, ну вот честно. Ради любопытства, можете сказать, как вы предполагаете использовать 2 мьютекса для синхронизации между потоками? ну вот чисто теоретически? А если это никак - то о чем вопрос??
Вячеслав написал: P.S. Подозреваю, что в QLua просто переопределили lua_lock и lua_unlock, чтобы разрешить многопоточность. Сейчас выясняю, как выполняется синхронизания глобальных переменных в Lua между потоками при переопределённых lua_lock / lua_unlock.
Вы так пишете, как-будто есть другие способы. Про это уже писалось (на старом форуме, как водится).
disasterovich, у вас совсем немного инструментов, между которыми вы переключаетесь.
А что если сделать несколько вкладок, на каждой вкладке - график своего инструмента. Тогда это разные графики, на каждом свои тренды. И переключаться легко и быстро.
Вячеслав написал: используется разные структуры lua_State*
Это вот откуда такой вывод?
Цитата
Вячеслав написал: и сразу ли значение, присвоенное в одном lua_State станет доступно в другом
Конечно сразу. Вы и сами легко это можете проверить, добавляя в колбеке за раз 100 (или тысячу) элементов одном потоке, и тут же вычитывая их в main(). Новые элементы будут видны в main еще до завершения колбека.
Николай Камынин написал: т е на какой момент извлеченный в main элемент будет первым в таблице, если колбеке есть вставка первого элемента?
Таблица, как известно, в QLua всегда целостна. Не зависимо от многопоточного обращения. Целостна в том смысле, что в любой момент времени количество элементов, вычитываемое через получения размера в таблице гарантированно совпадает с реальным количеством элементов на момент вычитывания значения счётчика.
Потому не очень понятен ваш вопрос. Если на момент обращения элемент в таблице уже размещён - то произойдёт корректное обращение к элементу таблицы, если же элемент еще не размещен - то его и не будет!
Единственное тонкое место, как известно из предыдущих обсуждений, состоит лишь в том, что если в одном потоке у нас есть t[1] = 5 (поток 1) а в другом потоке есть x = t[1] (поток 2) и они происходят "одновременно", то возможны варианты:
а) x = t[1] приведёт к ошибке, т.к. на самом деле в потоке 1 этот код еще вовсе не начал выполняться и элемент еще не добавлен; однако тогда и счётчик нам скажет, что количество элементов еще 0 (если это первый элемент)
б) после выполнения x = t[1] не будет ошибки, но в x окажется nil; это произойдёт в том случае, если в потоке 1 уже успеет добавиться новый элемент в таблицу с индексом 1, однако само значение ему еще не присвоится; (хотелось бы отметить, что само состояние таблицы будет при этом совершенно корректным! т.е. количество элементов в таблице равно 1, это единственный элемент равен nil)
в) в результате выполнения после x = t[1] в x будет значение 5, т.е. к моменту выполнения этого кода в рамках потока 2 в потоке 1 уже успел и новый элемент в таблицу добавиться, и значение ему присвоиться.
Николай, вы очень невнимательны. Исходники лежат рядом, каждый может легко их прочитать и собрать самостоятельно, во избежание. Ну и, конечно, любопытно, что вы скажете о разных торговых приводах, которые авторы принципиально распространяют только в бинарном виде.
У меня есть пожелание к ARQA: сделайте опцию "не загружать обновление для файла Winros.exe" Файл это в самом деле не нужен, но напоминания про наличие обновлений только из-за него - задалбывает. Спасибо.
Что касается "Потокобезопасных функции для работы с таблицами Lua" - то они несколько про другое. Во всяком случае они не реализуют тот алгоритм, который приведён в примере. Отличие будет в том, что не будет лочения потоков на время обработки всех элементов таблицы. Подходит ли это автору вопроса - не понятно. Он ведь лочит вокруг всего цикла обработки, а не вокруг обработки одного элемента.
Вячеслав, то как вы делаете, на мой взгляд в общем-то идеально. Не могу только понять при чем тут версия квика, от неё точно ничего здесь не зависит.
Идеальность в том, что вы, с одной стороны, полностью блокируете работу с таблицей из другого потока на все время добавления в неё элемента, с другой стороны полностью блокируете добавление в таблицу на всё время перебора имеющихся элементов внутри main(). Т.е. у вас всегда гарантированно в цикле обрабатывается некое полностью статичное состояние таблицы. И это само по себе безусловно здорово.
Однако, есть важный момент. Состоит он в том, что на всё время обработки таблицы (в main()) у вас фактически полностью блокирована работа call-back'ов при наступлении события OnParam(). И тут уже возникает вопрос про эффективность такого алгоритма. В самом деле: видно, что вы пытаетесь сделать "очередь событий" в таблице, и события из этой очереди разгребаете как бы в отдельном потоке main(). Но в вашем алгоритме вы не можете положить в таблицу очередное событие из OnParam() до тех пор, пока не обработали все имеющиеся события в таблице. Т.е. у вас получится, что в таблицу попали какие-то события (в виде элементов таблицы), вы их в main() обрабатываете - и на всё время этой обработки у вас OnParam() тупо залочен, QUIK стоит и ждёт, пока вы в main() обработаете все имеющиеся элементы таблицы. Не видно, чтобы тут случился выигрыш-то от двухпоточности. У вас всё равно каждый поток постоянно ждёт другой поток, в том числе и поток добавления событий.
Ну т.е. в "тёмной теме" шрифт и высоту заголовка изменить нельзя, верно? Недоработочка это, как мне видится. Зарегистрируйте, пожалуйста, пожелание: "желаю настраивать высоту заголовков окон в тёмной теме (обычных и "лоченых" окон раздельно) и шрифт (размер, цвет) шрифта заголовка окна"
Sergey Gorokhov написал: > При успешном завершении вызовов Add/SetLabel метка будет сохранена в хранилище, вот и ответ
Сергей, на что это ответ? Какая-то метка будет сохранена. Что входит в понятие "метка" - совершенно не ясно. Трактовать это можно как угодно, в том числе и так, что "параметры метки будут сохранены, а когда придёт время отрисовки - прочитаем картинку из файла".
Так что вы опять не ответили точно на вопрос, поэтому я и пишу, что ответа - нет.
DMITRYQ, быть может вас не затруднит перед отправкой сообщения нажимать кнопочку "Просмотр" и предварительно смотреть, что же получается в итоге? Читать ваши сообщения крайне сложно, а значит они не будут прочитаны.
Позвольте встряну. Sergey Gorokhov, в вашем ответе нет главного: когда можно удалять BMP-файл c диска, но при этом быть уверенным, что метка уже будет отрисована и удаление файла не помешает отрисовке?