4. Значит ли это, что реально, дескриптор окна таблицы никуда не разрушается, а окно просто "прячется" - т.е. получает сообщение WM_SHOWWINDOW с wParam = false?
Простенький минимально достаточный для создания окна скрипт:
Код
is_run = true
function OnInit()
t_id = AllocTable()
CreateWindow(t_id)
SetWindowCaption(t_id, "thats my table")
end
function main()
while is_run do
sleep(100)
end
end
function OnStop()
DestroyTable(t_id)
is_run = false
return 1000
end
После его работы - создаётся большущее окно без названия и только потом - окно в один столбец но, очень длинное по вертикали. При этом, если передёрнуть скрипт несколько раз - положение окна будет всё время меняться в сторону приращения координат левого верхнего угла по X и по Y. Про функцию SetWindowPos - знаю. И о ней мне говорить не надо. Вопрос:
получается, что на самом деле, при создании окна - собирается какой-то мусор от предыдущих экземпляров - хотя, при остановке скрипта - его LUA VM должна быть полностью разрушена, равно как и переменные ею занимаемые/устанавливаемые.
Почему при создании окна таблицы вылазиет ещё одно большое окно? Внешне это выглядит, как неприятное единовременное мерцание. подозреваю, что это одно и тоже окно но, заданное с большими дефолтными размерами и только потом, они почему-то опять меняются непонятным образом.
Значит ли это, что внутри функции CreateWindow(t_id) - снова меняются размеры окна?
в наше время, определённо - НЕТ. Именно для этого создаются личные профили/кабинеты внутри сайтов - чтоб пользователь мог сам фильтровать поток, а не превращать e-mail в корзину для мусора. Не думаю, что информация здесь находящаяся нуждается в немедленной реакции (сродни смс-уведомлениям). Поэтому, если у пользователя находится время на чтение e-mail - то и на визит в свой личный профиль и "кликанье" по своему "избранному" - тоже найдётся.
Цитата
Дмитрий пишет: Его с успехом может заменить меню "избранное" в браузере.
могу Вам сказать, что в моём браузере, в "моём избранном" - можно потеряться))))). И ведь, - всё как говорится: "надо" и ничего не выкинешь))))
я думаю, тут больше не хватает события именно отпускания (отжатия) клавиши. Что-нибудь, вроде QTABLE_VKEY_UP. Либо, отдельной функции: ScanKeyState, позволяющей определить факт нажатия/отпускания клавиши вне зависимости от прихода событий в QTAble. Собственно, она уже есть в WINAPI: вот она: GetAsyncKeyState
QTABLE_CHAR – нажата символьная клавиша, при этом par2 содержит код клавиши, par1 – текущую выделенную строку,
QTABLE_VKEY – нажата клавиша, при этом par2 содержит код клавиши, par1 – текущую выделенную строку,
QTABLE_LBUTTONUP – отпущена левая кнопка мыши, при этом par1 содержит номер строки, par2 – номер колонки,
также известно (например, из примеров VCL Delphi): что Click - это вовсе никакой не "клик", а элементарный xBUTONUP на определённой территории (регионе), в данном случае, -> ячейки таблицы Таким образом:
заводим в классе булевую переменную, которая будет флагом нажатия определённой клавиши, которую мы получим в другом коллбеке (QTABLE_VKEY).
далее, при приходе LBUTTONUP проверяем установлен ли этот флаг (полученный VKEY) and находимся ли мы в заданной ячейке. И если "Да" - do smth
------------------------------- примерно так делают в других программах.
Для того, чтобы это было осуществимо средствами WINAPI - надо (в самом простом варианте/случае):
Создать окно средствами QTable.
Чтобы оно не потерялось - обозвать его с помощью Caption. Потом найти окно в системе с таким заголовком и по нему хендл и, возможно класс...
Потом, с помощью переопределения оконной процедуры (SetWindowLongPtr и т. д. и т. п.) - уже творить с ним, что заблагорассудиться. НО!!! Из-за такой "затеи" - абсолютно непонятно как это будет сочетаться с квиком и привязкой к вкладкам, а также на реакцию на оконные сообщения Windows бо как у нас ещё в памяти таким образом создастся совершенно не нужный объект - тот самый QTable да ещё с непонятным поведением и свойствами
таким образом, хотелось бы более "чистый" вариант от разработчиков.
Старатель пишет: При отсутствии возможности задавать положение окна на конкретной вкладке польза от такой функции будет сомнительной.
положение окна, его размер, обработка событий - всё это уже делается элементарно с помощью winAPI. Кроме того, можно также сделать, чтоб это всё запоминалось бо как info.wnd - это не панацея и никто не запрещает пользователям создавать/хранить свои настройки окон для своих скриптов в своих файлах.
Michael Bulychev пишет: Пожелание такого рода у нас есть и мы думаем над их реализцией.
а пока Вы думаете над их реализацией - было бы неплохо уже с чего-то начать: к примеру, если бы Вы сделали функцию в QLUA, возвращающую хендл текущей вкладки - то это бы избавило от массы проблем. функцию можно назвать например так: getActiveTabbed(). В качестве результата - можно возвращать либо таблицу с дополнительной информацией (например, название вкладки, хендл её окна и т. п.) либо же просто хендл. Хранить параметры и доставать их можно через стандартный механизм хранения таких вещей, как: LightUserData.
Сделать это для Вас - не составит великого труда (займёт не больше часа), а пользы будет действительно много. НО!!! Только не надо нам тут подсовывать, какой-то не Windows-описатель, как это сделано у Вас с QTable. Нам нужна возможность полноценной привязки к вкладке и возможность "перепрыгивать" с вкладки на вкладку.
Sergey Gorokhov пишет: Здравствуйте, Не вижу проблемы в данном конкретном случае. Стек TCP/IP вполне может подразумевать пакетную передачу данных, это вполне нормальное поведение. Если смущает задержка в 0,00001 то это вполне допустимое значение, даже у света есть скорость.
Возможно поможет тонкая настройка сетевой карты. Поищите инструкцию в интернете для Вашей сетевой карты. Также поищите информацию по запросу "Настройка протокола TCP/IP" Любые настройки в этом месте на ваш страх и риск.
они ещё, как правило любят "посылать" почитать документацию на шлюз на сайт биржи. Когда у них спрашивали про несовпадение параметров и постоянные "додумывания" - то если, ка бы это по-мягче перефразировать: "мол де включайте ассоциации: если это выглядит, как чёрное и делает то, что чёрное - значит это чёрное". Разговор, если не изменяет память был около месяца - двух назад.
Скажу даже больше - те названия формальных параметров, которые - "большими буквами" - это, в терминологии разработчиков: СТАТИЧНЫЕ параметры. т.е. те, которые, как правило, не изменяются за торговую сессию. Также верно и то, что они, разработчики, не дают по ним и по синхронности их прихода никакой гарантии. (кто это сказал - сами найдёте через поиск.)
неугомонный))) Вывод по DDE (порядок следования столбцов) - совпадает с тем, что в квиковской ральной таблицеТТП. Реальные названия формальных параметров - нетрудно сопоставить. Бо как это надо сделать лишь один раз. Далее, по документации в разделе "просмотр информации" (так кажется называется) - можно снабдить получившуюся таблицу более полными комментариями по каждому параметру. Нечто подобное для себя уже сделал.
открываете документацию по квику, ныряете в раздел "тупайл", далее в описание работы с ТТП и будет вам счастье. Там вы найдёте полный список параметров. Реальный же список - будет зависеть от того, какие параметры транслирует брокер, а также от класса активов: для опционов - одни параметры, для акций - другие.
хочу привести реальный пример, из жизни. хоть он и несовсем по теме - но главное - суть: есть 3D-движок CryEngine - от вполне себе современной и раскрученной игры. Причём, он тоже поддерживает LUA. Так вот: чуть покопавшись в его SDK и примерах скриптинга - я чот не нашёл там ни повального использования метатаблиц, ни корутин, ни потоков. Там есть развитая библиотека уже встроенных на уровне движка объектов (Entity). Чтобы наследовать какой-то объект или свойство от другого объекта - там не надо писать полушаманский код на метатаблицах - всё сделано на уровне домохозяек и школьников - хочешь наследовать - вызови пару функций и будет тебе счастье. Насчёт доступа ке глобальным переменным, во многих скриптовых движках - уже давно для этого используют классы, т.е. глобальная переменная - это - тоже класс, причём встроенный в сам движок. Пользователь - вообще в данном случае не думает ни о каких потоках и синхронизации - он просто дёргает методы и навешивает на эту глобальную переменную - события. Список можно бесконечно продолжать. Хочется ещё раз спросить: для кого эта QLUA - затевалась? Кто целевая аудитория? Какие перспективы? Если всё - это для трейдеров - то это точно не для них, потому как разгребать за вами ваши же огрехи ценою своего счёта по причинам описанным выше - не хватит денег ни у кого. Если это для программистов - то программисты от него тоже - не в восторге. Им было бы куда проще и гибче писать на C++ и не быть ни в чём стеснёнными. Я не спорю, что сама по себе LUA - вполне себе достойный скриптовый язык. НО!!! Вы доведите её уже наконец, до ума, а не выпускайте на рынок вечно-сырой продукт.
честно сказать, я уже и на майн и на потоки согласен НО! Дайте примеры достойные подражания? А то - документация - никакая, техподдержка, если почитать их сообщения со старого и этого форума и сопоставить (благо MySQL сейчас может пользоваться каждый) друг другу - противоречит, разработчики - привыкли ограничиваться лишь парой фраз. В итоге, как говорится, "вот вам qlua и (ну вы поняли...)". При этом, сотрудники компании ещё сильно обижаются, когда их упрекают в отсутствии знания собственного продукта. Видать, писать, что "проблема будет исправлена в следующей версии" в этой компании уже давно вошло в привычку за 15 лет.
Michael Bulychev, Прошу Вас, самым детальнейшим образом расписать, как устроено межскриптовое взаимодействие/влияние в QLUA -> интересует: 1. порядок инициализации главной виртуальной машины - > что после чего запускается, как и на каком этапе происходит цикл регистрации и опроса коллбеков. 2. Также прошу расписать в каких случаях создаётся новый lua-thread (имеется ввиду только в обычных скриптах. 3. (несовсем по теме, конечно, но... ) 1. в какое место совать свою GUI-билиотеку? в основное тело скрипта, 2. в майн 3. или создавать для этого новый поток ОС и делать в нём свою message-loop бо как диспетчеризация сообщений квиковским главным потоком уже будет не досягаема?
простой принцип - Вам уже описали выше. а вообще, для начала почитайте книгу от Роберто Иерусалимски "Программирование на языке LUA". Третье издание. После этого у Вас исчезнет большая часть вопросов.
Любое обращение к глобальным переменным, равно как и любая модификация стека в LUA происходит через критические секции. Исследования показывают, что нет в целом ряде случаев абсолютно никакой выгоды от многопоточности, если не используется соответствующая операционная система и многоядерные процессоры. Широко распространено и подтверждено на практике мнение, что число потоков - должно соответствовать числу ядер. Вот, кстати, статейка на тему: http://www.dtf.ru/articles/print.php?id=39888
и если уж тут заговорили про МТС -> признаюсь, как бы мне не хотелось увеличить число одновременно торгующих ботов - но мой канал связи клиент-брокер-биржа-брокер-клиент - позволяет обрабатывать только 4 заявки в секунду. т.е. получается 250ms "на круг". При том, что реальная торговля через выделенные шлюзы может доходить до 3 ms. Но это уже, для меня, - дело весьма отдалённой перспективы.
Старатель пишет: на случай "потери" части свечей сервером
а как робот поймёт, что это "потеря", а не неликвид?
для себя - сделал таблицу: критичных и некритичных параметров, а также контроль так сказать целостности данных на случай намеренного и ненамеренного "технического сбоя" - т.е. составляется по каждому классу - профиль поведения изменения параметров и если параметры не укладываются в профиль - торговля: либо прекращается, либо - при возможности - закрывается позиция. Очень часто такую картину можно наблюдать во время планок - на доске опционов - не пойми что. Также мониторится серверное время и локальное - при слишком большой разнице - некоторые алгоритмы - отменяются (выставляется соответствующий флаг), изменяется также скорость подачи заявок роботом.
-------------- а вообще - конечно, интересная тема.
Alexey Ivannikov а почему у Вас на сайте отсутствует информация о версии 10.5.0? При том, что нашёлся человек, который откуда-то взял. Могу я ознакомиться с изменениями в этой версии?
судя по контексту - это модуль торгового интерфейса Фондового рынка Московской Биржи, отсюда: http://www.quik.ru/news/updates/ но на сайте - я не нашёл никакого упоминания об этой версии и уж тем более о заявленных выше возможностях. После версии 10.3 идёт сразу 10.7.0